我正在尝试在连接后选择多个列。我没有找到一种方法来使用ActiveRecord,而无需在查询中的引号之间编写SQL(我想避免使用)
探索Arel,我发现我可以使用“project”选择多个列,但是我不确定我是否应该直接使用Arel,或者是否有办法实现与AR的相同。
以下是Arel中的代码:
l = Location.arel_table
r = Region.arel_table
postcode_name_with_region_code = l.where(l[:id].eq(location_id)).join(r).on(l[:region_id].eq(r[:id])).project(l[:postcode_name], r[:code])
运行此查询后,我想返回以下内容: (伪代码)
"#{:postcode_name}, #{:code}"
提前致谢,
答案 0 :(得分:0)
使用AR,无需编写任何SQL并假设您的模型和关联是:
模型/ region.rb
class Region < ActiveRecord::Base
has_many :locations
end
model / location.rb
class Location < ActiveRecord::Base
belongs_to :region
end
你当然可以这样做:
postcode_name_with_region_code = Location.where(:id=>location_id).includes(:region).collect{|l| "#{l.postcode_name}, #{l.region.code}"}
这将执行查询,然后使用Ruby格式化您的结果(请注意,它将返回一个数组,因为我假设可能会返回多个记录)。如果您只想要一个数组项,可以使用array.first方法来引用它。
您还可以急切加载关联并根据结果构建字符串:
my_loc = Location.find(location_id, :include=>:region)
postcode_name_with_region_code = "#{my_loc.postcode_name}, #{my_loc.region.code}"
答案 1 :(得分:0)
predicate = Location.where(:id=>location_id).includes(:region)
predicate.ast.cores.first.projections.clear
predicate.project(Location.arel_table[:postcode_name], Region.arel_table[:code])