讓我們說,我們有4個表導軌 - 加入4桌
Client has many Campaign
Campaign has many Adgroup
Adgroup has many Ad
Ad
的關係是一樣的,一對多。假設我們已經知道Ad.id,並且我們想從該Ad.id獲取Client.id。
任何人都可以給一個優雅的解決方案(通過優雅的我的意思是沒有寫入sql語句,而是使用活動記錄程序)?
讓我們說,我們有4個表導軌 - 加入4桌
Client has many Campaign
Campaign has many Adgroup
Adgroup has many Ad
Ad
的關係是一樣的,一對多。假設我們已經知道Ad.id,並且我們想從該Ad.id獲取Client.id。
任何人都可以給一個優雅的解決方案(通過優雅的我的意思是沒有寫入sql語句,而是使用活動記錄程序)?
確保Ad belongs_to
是一個Adgroup,並在它的db結構中引用它!一直以來,廣告組都應該有belongs_to
廣告系列等等。請記住,與belongs_to
的夥計是需要在他的db表中爲他的那個人提供參考的人,而不是相反!
如果創建的資源可以開始,那麼您應該能夠撥打@ad.adgroup.campaign.client.id
並獲取特定廣告(例如獲得@ad = Ad.find(some_id)
)id。
希望這會有所幫助!
是的,這也是最初想到的,但我在某個地方讀到這不是一個好習慣。它運行緩慢,吃資源。我正在爲解決方案與:連接參數,但不知道如何在沒有查詢的軌道中做到這一點。 – hudarsono
好吧,據我所知,因爲你在模型中創建了這種關係,所以rails會在後臺執行連接,所以我真的不覺得這個代碼有問題。 –
使用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的位置:
首先,確保你有你的關係設置如下:
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
client_id = ad.adgroup.campaign.client.client_id? – Bjoernsen