如何使用'和#39;构建arel查询和'或#39;在不同的桌子上?

时间:2014-05-11 19:04:18

标签: ruby-on-rails activerecord arel

2个型号:DimensionDimensionType

DimensionType has_many :dimensions

如何使用arel或经典ActiveRecord构建此类查询:

select * from dimension_types dt
inner join dimensions d on d.dimension_type_id=dt.id
where 
(dt.identifier = 'geo' and d.identifier in ('uk','us'))
or 
(dt.identifier = 'unit' and d.identifier in ('bn', 't'))

我需要选择的维度和维度类型的数量是动态的,例如:

queryArguments = {geo: [:uk, :us], unit: [:t, :bn], x: [:y, :etc]}

我正在使用Rails 4

1 个答案:

答案 0 :(得分:0)

你可以在DimensionType建模这样的东西:

def self.search params
  params.keys.inject([]) do |result, dt_identifier|
    result += DimensionType.joins(:dimensions).where("dimension_types.identifier", dt_identifier).where(["dimensions.identifier IN (?)", params[dt_identifier]])
  end
end

然后,您可以像这样使用它:

DimensionType.search({geo: [:uk, :us], unit: [:t, :bn], x: [:y, :etc]})