Rails(ActiveRecord):最后选择覆盖之前的

时间:2016-01-03 15:35:23

标签: mysql ruby-on-rails activerecord

我想加入两个选择:

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

仅选择 列。我认为彼此选择会覆盖前一个。是否可以连接许多选择

以上代码只是基于我的实际问题的简单示例。解决方案就像将所有内容放在一个选择

Place.select('name, city)

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

使用Arel

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) )

希望这有帮助,

欧根