2014-07-03 69 views
-8

在問你之前,我無法控制在我正在使用的數據庫中創建任何視圖或連接表。ActiveRecord加入非默認值的嵌套關聯

我在ActiveRecord的文檔,你可以做多層次的加盟發現:

12.2.4 Joining Nested Associations (Multiple Level) 

Category.joins(articles: [{ comments: :guest }, :tags]) 
This produces: 

SELECT categories.* FROM categories 
    INNER JOIN articles ON articles.category_id = categories.id 
    INNER JOIN comments ON comments.article_id = articles.id 
    INNER JOIN guests ON guests.comment_id = comments.id 
    INNER JOIN tags ON tags.article_id = articles.id 

在那裏你可以指定要加入什麼就

Client.joins('LEFT OUTER JOIN addresses ON addresses.client_id = clients.id') 

我想要做的是什麼,結合了2

Client.joins('Inner Join addresses on addresses.client_name = client.name').joins('Inner Join state on state.abreviation = addresses.state_abreviation) 

或在原始SQL

Select client.* from client 
Inner Join addresses on client.client_name = addresses.client_name 
Inner Join state on addresses.state_abreviation = state.abreviation 

,如果我能做到這一點使用的關聯,而不是加入,這將是偉大的!:

class Category < ActiveRecord::Base 
    has_many :articles 
end 

class Article < ActiveRecord::Base 
    belongs_to :category 
    has_many :comments 
    has_many :tags 
end 

class Comment < ActiveRecord::Base 
    belongs_to :article 
    has_one :guest 
end 

class Guest < ActiveRecord::Base 
    belongs_to :comment 
end 

class Tag < ActiveRecord::Base 
    belongs_to :article 
end 
+0

看起來有'地址'表和相關的模型,你在這裏省略。那是對的嗎? – San

+0

@San我包含了我正在尋找的內容「我想要做的就是結合2」 –

+0

您描述了具有關聯的活動記錄模型,與您在第二個連接請求中編寫的表格和模型不同。這是令人困惑的,並且不符合活動記錄模式 – edikgat

回答

-2

I F找到答案。您需要爲該表定義foreign_key,以便將其映射回。

belongs_to :addresses, foreign_key: 'state_abreviation' 
+0

用戶無法理解你的答案,因爲在問題你沒有描述你的數據庫結構 – edikgat

+0

好的工作,你看了軌道手冊:) .... aaand,這只是你的問題的開始:)嘗試玩查詢和更復雜的範圍 – bbozo

+0

延長這一點,看看在http://stackoverflow.com/questions/24685837/activerecord-includes-not-working-with-foreign-keys –

0

你可以使用「到」 您的分類模型中,這些會是這樣

class Category < ActiveRecord::Base 
    has_many :articles 
    has_many :comments, through: :articles 
    has_many :tags, through: :articles 
end 

Category.last.tags 
=> tags 
Category.last.articles 
=> articles 
+0

這並不能解決我的問題。我正在尋找如何做自定義列協會 –

+0

我寫了數據庫架構的答案,你描述 – edikgat

3

使用阿雷爾:

c = Client.arel_table 
a = Adress.arel_table 
s = State.arel_table 
query = Client.all.arel 
     .join(a) 
      .on(a[:client_name].eq(c[:client_name])) 
     .join(s) 
      .on(s[:abreviation].eq(a[:state_abreviation])) 
Client.find_by_sql(query.to_sql) 
+0

另外,檢查squeel https://github.com/activerecord-hackery/squeel – bbozo