2011-08-06 107 views
2

型號:Ruby on Rails的ActiveRecord的連接 - 選擇字段從多個表

#StatusMessage model 
class StatusMessage < ActiveRecord::Base 
    belongs_to :users 
    default_scope :order => "created_at DESC" 
end 


#User Model 
class User < ActiveRecord::Base 
    has_many :status_messages 
end 

在控制器我想加入這兩個表,並從兩個表中的字段。例如我想要email字段Userstatus字段StatusMessage。當我使用:

@status = User.joins(:status_messages) 

或者

@status = User.includes(:status_messages) 

它給我的只有用戶表中的數據。

我該如何執行此要求?

回答

6

這裏您需要使用includes。它會預加載數據,因此當您執行@user.status_messages時,您不會再有其他SQL查詢。

是的,你不能真正看到效果:你需要檢查你的日誌。

2

首先,我不認爲你想要做什麼是可能的(也是合理的)。原因是UserStatusMessage之間的關係是1:n,這意味着每個用戶可能有0到n個狀態消息。應該如何將這些衆多屬性包含在用戶模型中?

我認爲ActiceRecord類中的方法joints具有不同的含義,它是query interface的一部分。看到問題LEFT OUTER joins in Rails 3

有在網絡上類似的問題,這裏是我發現,匹配最:

  • Ruby on Rails: How to join two tables:包括用戶(翻譯成您的例子)一個primary_status_message,然後將其物化在用戶的查詢中。但它是在一個屬性舉行,訪問STATUS_MESSAGE的屬性,你必須做這樣的事情:@user.primary_status_message.status
1

當您使用@status = User.includes(:status_messages),然後軌eagerley加載所有表格的數據。我的觀點是當你使用這個User.includes(:status_messages)它也會加載status_messages的數據,但只顯示用戶表數據,那麼如果你想要第一個用戶status_messages,那麼你必須@ user.first.status_messages

相關問題