2011-10-10 14 views
1

インスタンスレベルの制約は、reils 3.1のhas_many、:throughの関係で設定できますか?has_many:throughインスタンス固有の条件

http://guides.rubyonrails.org/association_basics.html#the-has_many-association

のようなもの:ドキュメントは、私はこれを期待し得られますが、それは私のために動作しません

Class A 
    has_many :c, :through => :b, :conditions => { "'c'.something_id" => @a.something_id } 

あなたは時に動的に条件を評価する必要がある場合実行時に 文字列補間をシングルクォートで使用することができます。

class Customer < ActiveRecord::Base 
    has_many :latest_orders, :class_name => "Order", 
    :conditions => 'orders.created_at > #{10.hours.ago.to_s(:db).inspect}' 
end 

これにより、レール3.1に「認識されないトークン「#」」が表示されます。この機能がもう機能しないのだろうか?

EDIT

は、私はスコープが解決されているとは思わない理由を明確にしたいです。 Aのインスタンスから取得できるようにしたいのは、(Aのインスタンスの属性に基づく)条件を持つすべてのCです。スコープでこれを行うには、スコープをCに入れて引数をとり、それからある値で@aからコールする必要があります。なぜ私のhas_manyクエリに直接組み込むよりも優れているのですか?

答えて

2

ordersモデルにスコープを使用します。

class Order < ActiveRecord::Base 
    belongs_to :customer 
    scope :latest, lambda { where('created_at > ?', 10.hours.ago) } 
end 

し、次いでそれを呼び出す:

@customer.orders.latest 

そして、あなたは本当にlatest_ordersを使用したい場合は、あなたが代わりに顧客モデルにこれを追加することができます:

def latest_orders 
    orders.where('created_at > ?', 10.hours.ago) 
end 
+0

はい。ソートする場合でも、関係する節を条件と混同しないでください。それは間違ったやり方を考えているでしょう。 –

+0

私はスコープで私の例でやろうとしているhas_manyをどのように複製するのですか?私は自分の条件でprocを使って動作させているので、なぜこれが良いのか分かりません。私は私の場合、Aは実際には条件が成立するhas_many "C"しか言及していない。他の結果は関連付けられておらず、返さないと意味がありません – spike

+0

説明した方法でスコープを使用する必要があります。関係はモデル間であり、「latest_order」はモデルではなく、モデルのスコープです。 Railsのタグラインは "働き過ぎのコンベンション"であり、ここではコンベンションでスコープを使用しています。 – bricker

関連する問題