2014-06-30 62 views
0

我從Active Record採集中發現了一個奇怪的行爲。檢索多個記錄,使用連接和採摘的列

我查詢

Friend.joins('INNER JOIN users ON friends.friend_id = users.id').where("user_id=? AND (status=? or status=?)", 4,"true","").pluck("users.first_name, users.last_name") 

它與各界朋友與用戶,並得到用戶的姓氏和名字

生成的SQL命令是

SELECT users.first_name, users.last_name FROM "friends" INNER JOIN users ON friends.friend_id = users.id WHERE (user_id=4 AND (status='true' or status='')) 

如果我上面的命令運行在SQLite瀏覽器工具

我得到的回覆如

first_name last_name 

    user4  y 
    user5  y 

但在命令行與勇氣

["y", "y"] 

和命令行用的find_by_sql

[#<Friend >, #<Friend >] 

什麼是錯在我的代碼,或者是問題的勇氣和的find_by_sql

我該如何解決這個問題?

在此先感謝

回答

0

配置/初始化/ pluck_all.rb

module ActiveRecord 
class Relation 
    def pluck_all(*args) 
    args.map! do |column_name| 
    if column_name.is_a?(Symbol) && column_names.include?(column_name.to_s) 
     "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(column_name)}" 
    else 
     column_name.to_s 
    end 
    end 

    relation = clone 
    relation.select_values = args 
    klass.connection.select_all(relation.arel).map! do |attributes| 
    initialized_attributes = klass.initialize_attributes(attributes) 
    attributes.each do |key, attribute| 
     attributes[key] = klass.type_cast_attribute(key, initialized_attributes) 
    end 
    end 
end 

末 結束

Friend.joins('INNER JOIN users ON friends.friend_id = users.id').where("user_id=? AND (status=? or status=?)", 4,"true","").pluck_all("users.first_name","users.last_name") 

解決我的問題,這純粹是一個勇氣的問題。

感謝一個great tutorial

0

如果你使用的軌道4,你可以做

而不是

.pluck("users.first_name, users.last_name") 

嘗試

.pluck("users.first_name", "users.last_name") 

在軌道3,你會想使用select選擇這些特定字段

.select("users.first_name", "users.last_name") 
+0

它提供了一個錯誤錯誤的參數數目(2表示1) – santosh

+0

您使用的是哪種版本的導軌?對不起,忘了採用rails進行修改4. Rails 3只接受1個參數。 –

+0

我只使用rails3 – santosh

0

在製造軌道3的方法,其行爲一樣的軌道4拔毛具有多個列的條款。 這會輸出一個類似的數組(而不是散列鍵值集合)。

module ActiveRecord 
    class Relation 
    def pluck_all(*args) 
     args.map! do |column_name| 
     if column_name.is_a?(Symbol) && column_names.include?(column_name.to_s) 
      "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(column_name)}" 
     else 
      column_name.to_s 
     end 
     end 

     relation = clone 
     relation.select_values = args 
     klass.connection.select_all(relation.arel).map! do |attributes| 
     initialized_attributes = klass.initialize_attributes(attributes) 
     attributes.map do |key, attribute| 
      klass.type_cast_attribute(key, initialized_attributes) 
     end 
     end 
    end 
    end 
end 

站在巨人的肩膀上,所有(@santosh)

0

article @santosh共享是偉大的,直到我準備從Rails的3.2升級到Rails 4。

這是一個gem pluck_all來解決這個問題,使得pluck_all方法不僅支持Rails 3,而且支持Rails 4和Rails 5.希望這可以幫助那些將要升級rails版本的人。