1

我从 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

4 回答 4

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")
于 2014-06-30T13:06:36.017 回答
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")

解决了我的问题,这纯粹是一个采摘问题。

感谢您的精彩教程

于 2014-06-30T13:38:50.613 回答
0

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

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)

于 2016-05-19T12:51:15.037 回答
0

在我从 Rails 3.2 升级到 Rails 4 之前,@santosh 分享的文章很棒。

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

于 2016-12-21T15:21:31.503 回答