推进活动记录加入

时间:2016-04-30 06:30:28

标签: ruby-on-rails activerecord

我有以下型号

Items 
Customisations
Property Maps

使用像这样的关联 -

**Customizations**
belongs_to :item
has_many :property_maps, as: :mappable

 **Items**
  has_many :customizations
  has_many :property_maps, as: :mappable

**Property Maps**
belongs_to :mappable, polymorphic: true

我已经实现了一个相当不错的过滤系统,只考虑了像这样的项目和属性 -

    def self.filter_in_properties(property_ids, group_name)
           joins(:property_maps).joins('JOIN property_maps '+group_name+' ON '+group_name+'.mappable_id = items.id  AND '+group_name+'.property_id IN ('+property_ids.to_s.tr('[', '').tr(']', '').tr('"', '') +')')
    end

我在控制器中称它们为 -

@items_without_pagination.filter_in_properties(params[:color_filter], 'color_filter').uniq

如何构建过滤系统,以便当用户搜索红色时,它不仅返回属性为红色的项目,还返回具有属性为红色的自定义项目?

2 个答案:

答案 0 :(得分:0)

您可以使用menuModel将查询中的自定义设置与joins一起包含颜色为filter的项目/自定义设置:

'red'

这将返回Item.joins(:customizations).where("items.color = '?' OR customizations.color='?'", 'red').uniq item.color或任何'red'为红色的项目。

请注意,item.customizations应该是coloritems表格中的一列。

答案 1 :(得分:0)

这就是我最终做的事情 -

def self.filter_in_properties(property_ids, group_name)
    return all if property_ids.blank?
    joins('LEFT JOIN customizations as prop_customizations ON prop_customizations.item_id = items.id')
.joins('LEFT JOIN property_maps '+group_name+' ON '+group_name+'.mappable_id = items.id')
    .joins('LEFT JOIN property_maps '+group_name+'_customization ON '+group_name+'_customization.mappable_id = prop_customizations.id')
    .where('('+group_name+'.property_id IN ('+property_ids.to_s.tr('[', '').tr(']', '').tr('"', '') +')) OR ('+group_name+'_customization.property_id IN ('+property_ids.to_s.tr('[', '').tr(']', '').tr('"', '') +'))' ).distinct
end