2012-09-17 10 views
5

だ内部の問題は、私のようなものを呼び出すしようとすることです私はSTIパターンそれは子(STIパターン)

class A 
    scope :aaa, where([someField]:[someValue]) 
end 

class B < A 
end 

を使用してクラス階層を実装し、親モデルで定義された範囲を、使用:

B.limit(5).aaa 
=> SELECT "[table]".* FROM "[table]" WHERE "[table]"."type" IN ('A') AND ([someField] = [someValue]) LIMIT 5 
=「B」

タイプからスコープを使用するには、どのような方法がある場合、私は行と同じことを行う必要がある。しかし、AAA :範囲を満たすタイプAの

だから私は取得しています5つのオブジェクト親、STIパターンで子どもに再配布せずに?

事前に感謝

EDITED

私はちょうど私のfrindでそれを議論し、彼は私に一つの重要なことを示しました。 AはSTIのルートクラスではありません。実際に全体の階層は、多分その理由は、階層そのものである

class O < ActiveRecord::Base 
end 

class A < O 
    scope ..... ..... 
end 

class B < A 
end 

のように見える?...

答えて

2

あなたは、これは、マルチレベルの階層の結果であることが適切です。

継承レベルが1つしかない場合(つまりAActiveRecord::Baseから継承され、Oから継承された場合)、スコープは期待通りに機能します。

中間クラスを使用すると、Sails in Railsが期待どおりに機能しない場合があります。

これがRailsのバグであるのか、それとも何をすべきかを正確に推測することができないという結果になっているかどうかはわかりません。私はそれ以上のことを研究しなければならないでしょう。

経験した範囲の問題は、予期しない動作の一例に過ぎません。もう1つの例として、中間クラスをクエリすると、認識しているクラスタイプのみがクエリされます。具体的に要求しない限り、すべてのサブクラスが含まれない場合があります。

詳細については、 MatthewRudyの底:https://groups.google.com/forum/#!topic/hkror/iCg3kxXkxnA

@Atastorの推奨どおりにクラスメソッドの代わりにスコープを使用したい場合は、AではなくOにスコープを置くことができます。スコープがOのすべてのサブクラスには当てはまらないため、これは理想的ではありませんが、Railsがtype列の正しいクラスをクエリするように思われますが、すばやい回避策です。

1

私は、例えば、代わりにスコープのクラスメソッドを使用してに切り替えますクラスでクラスBで

def self.aaa 
    A.where([someField]:[someValue]) 
end 

、その後

def self.bbb 
    self.aaa.where("type = ?","B") 
end 
+0

それは動作しますが、基本クラスのスコープを入れてください、私はまだ私の例では、私はそれを期待していない好奇心働く理由 – AntonTkachov

0

あなたが試しているスコープを混乱させる可能性があるので、STI中間クラスに注意してください。

class A < ActiveRecord 
blabla 
end 
class B < A 
scope :dates, ->(start_date, end_date) { where(:date => start_date..end_date) } 
end 
class C < B 
<call scope_dates> 
end 
class D < B 
<call scope_dates> 
end 

をと範囲は、実際には、クラスCおよびクラスDの組み合わせを含めた:私の場合は

は私が持っていました。

だから、あなたはRailsの中でSTIを持っている場合ではない中間クラス