2016-07-25 12 views
0
の深い関係

問題2レベルのActiveRecord

私はレール内のActiveRecordクラスの2レベルの深い関係で働いています。私は3つのクラスfoo,barおよびblaを持っています。 fooが多くbar年代を持ち、かつbarは1 bla

を持っているすべての私の関係はつまり、Foo.find(1).bars.find(1).blasのようなものが正常に動作し、個別に正常に動作しています。問題は、fooが与えられているので、blaのActiveRecordセットはfoobarsに関連しています。これは明らかに解決策ですが、私はFoo.find(1).bars多くを呼び出す必要がありますが、まれにしか必要としないように私は、パフォーマンス上の理由からblaを正規化:私は1つのテーブルにbarblaを組み合わせる

を試してみた

物事bla

Foo.find(1).bars.blasblas方法は、単にここ

Foo.find(1).bars.map{|b| b.bla}存在しません:これは私がこれまでに見つけた最高の回避策です。しかし、マッピングの結果は配列なので、後でセットにActiveRecordメソッドを適用することはできません(これが目標です)。

答えて

2

has_manythroughオプションで設定する必要があります。

class Foo < ActiveRecord::Base 
    has_many :bars 
    has_many :blas, through: :bars 
end 

class Bar < ActiveRecord::Base 
    belongs_to :foo 
    has_one :bla 
end 

class Bla < ActiveRecord::Base 
    belongs_to :bar 
end 

その後、あなたは次のように与えられたFooインスタンスに関連付けられているすべてのbla Sを取得することができます:

irb(main):001:0> Foo.last.blas 
=> <ActiveRecord::Associations::CollectionProxy [...] 

詳細はRuby on Rails Guidesを参照してください。

+1

と呼び、Foo.find(1).blas –

関連する問題