2014-04-06 32 views
2

好了,所以,如果我做一個User.joins(:session_users),我只得到用戶表的屬性。的ActiveRecord加入

我如何在ActiveRecord的方式兩個表的屬性,即,不是SQL?

編輯一個

好吧,基於第一個答案,我試圖把它顯示出來。

所以,這是寫在用戶控制器的方法

def blah 
    @users = User.includes(:session_users) 
    @users.each do |user| 
     user.session_users 
    end 
end 

然後,我的用戶有這種說法blah.html.erb

<%= @users.session_users %> 

這在路由部分:

match "https://stackoverflow.com/users/blah" => "users#blah" 

回答

2

我想你想要includes而不是joins。有關更多信息,請參閱http://railscasts.com/episodes/181-include-vs-joins。這應該爲這兩列提取列,

users = User.includes(:session_users) 
users.each do |user| 
    user.session_users 
end 

請注意,這仍然執行2個SQL查詢。

編輯

更新的答案假設一個userhas_many :session_users

路線:

# config/routes.rb 

get '/users/blah' => 'users#blah' 

控制器:

# app/controllers/users_controller.rb 

class UsersController < ApplicationController 
    def blah 
    @users = User.includes(:session_users) 
    end 
end 

查看:

# app/views/users/blah.html.erb 

<% @users.each do |user| %> 

    <%= user.name %> // assumes user has a name attribute 

    <% user.session_users.each do |session_user| %> 
    <%= session_user.attributes %> // prints all the attributes 
    <%= session_user.created_at %> // assumes the user has a created_at attribute 
    <% end %> 

<% end %> 
+0

當我嘗試在控制檯中包含,它不顯示session_users表的屬性。 (是的,我知道它在幕後執行SQL - 只是想知道ActiveRecord的方式)。 – user273072545345

+0

在控制檯中查詢什麼?我已更新我的代碼示例以顯示如何訪問'user'的'session_users'。 – Sam

+0

好吧,最初它是我寫的原文。我在我的控制檯中嘗試了您的代碼示例,並且我仍然只獲取用戶的表格屬性。 – user273072545345

0

如果你真的需要從連接表字段添加到產生的對象,你可以添加select

User.joins("INNER JOIN stolen_passwords 
        ON users.social_security_number=stolen_passwords.ssn") 
    .select("*").find_each do |user| 
     logger.debug { 
     "A #{user.full_name} has a password hash #{user.password_hash}" 
     } 
end 

這裏假想user.full_nameUser實例方法和user.password_hash來自stolen_passwords表。您也可以通過顯式地在select的調用中列出查詢/返回字段來限制查詢/返回字段。

我們有時在rake任務中使用它來豐富數據庫或將其與第三方數據源進行比較:我們將使用提供的表格加入我們的表格,並使用兩列中的列生成「並排」CSV。普通SQL也可以正常工作,但通過活動記錄通常可以重用熟悉的範圍或以ruby執行計算的方法。

買者

不幸的是,從連接表來的字段將不會被轉換爲相應的寶石類型,他們都將是字符串(這是如果使用爲joins SQL字符串特別是邏輯)。但是很容易的東西,如投的加入屬性:

module CastJoinedColumns 
    def cast_joined_columns joined_record 
    columns_hash.each do |column_name, column| 
     if joined_record.attributes.include?(column_name) 
     joined_record[column_name] = column.type_cast(joined_record[column_name]) 
     end 
    end 
    end 
end 

這個模塊,就是要extended到出現在加入和方法的右側的模型與加盟紀錄被調用。對於多個表中出現相同列名的情況,它可能會有些不當,應該改進,但是這是一個好的起點(對於使用保證不與我們自己衝突的列名的第三方數據源完全適用於我們)。