2012-01-25 5 views
0

に参加するには、我々は関係が1対多、同じである4つのテーブルRailsの - レッツ4つのテーブル

Client has many Campaign 
Campaign has many Adgroup 
Adgroup has many Ad 
Ad 

を持っていると言います。 Ad.idがわかっているとしましょう。そのAd.idからClient.idを取得します。

誰もエレガントなソリューションを提供することができます(エレガントな私はSQLステートメントを書くことなく、代わりにアクティブなレコードの手順を使用して)意味ですか?

+3

client_id = ad.adgroup.campaign.client.client_id? – Bjoernsen

答えて

2

広告belongs_toが広告グループであり、その広告構造に参照があることを確認してください。広告グループはbelongs_toなどのキャンペーンを行ってください。覚えておいて、belongs_toの男は、has_oneという男に彼のdbテーブルの参照を保持する必要があるものです。

リソースが作成されていれば、@ad.adgroup.campaign.client.idに電話して、特定の広告(取得済み、たとえば@ad = Ad.find(some_id))のIDを取得できるはずです。

希望すると便利です。

+0

ええ、これも最初に頭に浮かんだものですが、私はそれが良い練習ではないということをどこかで読んでいます。それはゆっくり実行され、リソースを食べる。私は解決策のためにlokingしていました:パラメータをジョインしますが、クエリなしでそれを行う方法はわかりません。 – hudarsono

+0

まあ、私が知っていることから、あなたはモデルの中でその関係を作り出しているので、レールはバックグラウンドで結合を行います。だから、このコードでは本当に問題はありません... –

1

Rails関連では、関係の反対側にbelongs_toを指定することを覚えておく必要があります。そのため、広告はおそらくhas_one Adgroupなどとなります。アソシエーションを結合したら、ActiveRecordを使用して、下から順にこれらのモデルを連鎖させ、階層の一番上に行くことができます。ですから、広告から始めて、それが好きな連鎖になります。

@ad = Ad.find(an_id_or_name_or_whatever).Adgroup.Campaign.Client.id 

は、上記を見ると、あなたは、すべてのためにあなたがその親モデルのメソッドにアクセスすることができます連想関係の AdAdgroupをチェーンすることができます方法は .idClientモデルです。これを呼び出すことができます。

ここでのRailsからいくつかの関連の基本を見てみましょう:

http://guides.rubyonrails.org/association_basics.html

0

まず、次のようにあなたがあなたの関係を設定していることを確認:

class Ad < ActiveRecord::Base 
    belongs_to :ad_group, inverse_of: :ads 
end 

class AdGroup < ActiveRecord::Base 
    belongs_to :campaign, inverse_of: :ad_groups 
    has_many :ads, inverse_of :ad_group 
end 

class Campaign < ActiveRecord::Base 
    belongs_to :client, inverse_of: :campaigns 
    has_many :ad_groups, inverse_of :campaign 
end 

class Client < ActiveRecord::Base 
    has_many :campaigns, inverse_of :client 
end 

使用して参加して、あなたが望むすべての場合摘み取りますクライアントIDと効率的なSQLです:

Client.joins(campaigns: {ad_groups: :ad}).where(
    ads: { id: some_id }).pluck('clients.id').first 

クライアント全体と効率的なSQLが必要な場合は、

Client.joins(campaigns: {ad_groups: :ad}).where(ads: { id: some_id }).first 
関連する問題