2012-01-25 97 views
0

讓我們說,我們有4個表導軌 - 加入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

確保Ad belongs_to是一個Adgroup,並在它的db結構中引用它!一直以來,廣告組都應該有belongs_to廣告系列等等。請記住,與belongs_to的夥計是需要在他的db表中爲他的那個人提供參考的人,而不是相反!

如果創建的資源可以開始,那麼您應該能夠撥打@ad.adgroup.campaign.client.id並獲取特定廣告(例如獲得@ad = Ad.find(some_id))id。

希望這會有所幫助!

+0

是的,這也是最初想到的,但我在某個地方讀到這不是一個好習慣。它運行緩慢,吃資源。我正在爲解決方案與:連接參數,但不知道如何在沒有查詢的軌道中做到這一點。 – hudarsono

+0

好吧,據我所知,因爲你在模型中創建了這種關係,所以rails會在後臺執行連接,所以我真的不覺得這個代碼有問題。 –

1

使用Rails關聯,您必須記住爲關係的另一方指定belongs_to,因此廣告最有可能是has_one Adgroup等等等等。一旦你結合了這些關聯,你就可以使用ActiveRecord從底部開始鏈接這些模型,直到層次結構的頂部。所以,你會與廣告開始,IT連鎖,如:

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

綜觀上述情況,你可以鏈Adgroup到一個Ad因爲關聯關係,讓你訪問到父模型的方法,所有的到Client模型,其中.id是一種方法,您可以調用它。

看看一些協會基礎從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