我从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有问题
我该如何解决这个问题?
提前致谢
答案 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")
解决了我的问题,这纯粹是一个问题。
答案 2 :(得分:0)
在制作rails 3方法方面,其行为与Rails 4采用多列相同。 这会输出一个类似的数组(而不是散列键值集合)。
In [116]:
pd.Series(list(a))[0]
Out[116]:
array([0, 1, 2])
站在巨人和所有人的肩膀上(@santosh)
答案 3 :(得分:0)