我有以下型号
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
如何构建过滤系统,以便当用户搜索红色时,它不仅返回属性为红色的项目,还返回具有属性为红色的自定义项目?
答案 0 :(得分:0)
您可以使用menuModel
将查询中的自定义设置与joins
一起包含颜色为filter
的项目/自定义设置:
'red'
这将返回Item.joins(:customizations).where("items.color = '?' OR customizations.color='?'", 'red').uniq
为item.color
或任何'red'
为红色的项目。
请注意,item.customizations
应该是color
和items
表格中的一列。
答案 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