使用Joins和pluck检索多个记录,列

时间:2014-06-30 13:03:07

标签: sql ruby-on-rails activerecord join pluck

我从Active Record Pluck中发现了一个奇怪的行为。

我的查询是

 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

但是从带有pluck的命令行

   ["y", "y"] 

和find_by_sql的命令行

 [#<Friend >, #<Friend >]

我的代码有什么问题,或者是pluck和find_by_sql有问题

我该如何解决这个问题?

提前致谢

4 个答案:

答案 0 :(得分:0)

如果你正在使用rails 4,你可以

而不是

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

尝试

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

在rails 3中,您将要使用select来选择那些特定字段

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

答案 1 :(得分: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

答案 2 :(得分:0)

在制作rails 3方法方面,其行为与Rails 4采用多列相同。 这会输出一个类似的数组(而不是散列键值集合)。

In [116]:
pd.Series(list(a))[0]
Out[116]:
array([0, 1, 2])

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

答案 3 :(得分:0)

article @santosh分享很棒,直到我要从Rails 3.2升级到Rails 4.

这是一个gem pluck_all来解决这个问题,不仅在Rails 3中而且在Rails 4和Rails 5中支持pluck_all方法。希望这将有助于那些将要升级rails版本的人。