【问题标题】:Rails (ActiveRecord): Last select overrides previousRails (ActiveRecord):最后一个选择覆盖以前
【发布时间】:2016-01-03 15:35:23
【问题描述】:

我想加入两个选择:

Place.select('name').select('city')
# => SELECT "places"."city" FROM "places"

但它选择只有城市列。我认为另一个 select 会覆盖前一个。是否可以连接多个选择

上面的代码只是基于我的实际问题的简单示例。像把所有东西都放在一个select这样的解决方案:

Place.select('name, city)

...对我来说没用,因为我在很多地方多次加入它。

提前致谢!

【问题讨论】:

  • Place.select('name') & Place.select('city') ?
  • 这会产生两个单独的查询: Place Load (0.3ms) SELECT places.name FROM places Place Load (0.6ms) SELECT places.city FROM places
  • 我已经在 rails 4.2.5 控制台中检查了您的示例并且它有效。我可以链接 2、3、4 个选择,它们似乎连接正确。
  • 我目前使用的是 Rails 4.2.0。可能我需要检查更改了什么...

标签: mysql ruby-on-rails activerecord


【解决方案1】:

与阿雷尔

Arel 可用于实现您的目标...

p = Place.arel_table
arel_select = p.project('name').project('city')

arel_select.to_sql
=> "SELECT name, city FROM \"places\"" 

Place.find_by_sql(arel_select.to_sql)

也有用

arel_select = p.project('name')
arel_select.project('city').to_sql

但请注意...

arel_select = p.project('name').project('city').project('city')

arel_select.to_sql
=> "SELECT name, city, city FROM \"places\"" 

使用 ActiveRecord

merge 方法也可以合并选择的部分。

Place.select(:name).merge( Place.select(:city) )

产生以下 SQL

SELECT "places"."name", "places"."city" FROM "places"

结果关系:

=> #<ActiveRecord::Relation [#<Place id: nil, name: "Zoo", city: "Berlin">]> 

与上述结果相同

Place.select(:name).merge( Place.select(:city) ).merge(Place.select(:city) )

希望这会有所帮助,

欧根

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多