Ruby on rails 或在使用嵌套包含或关联联接时在where子句中
当使用关联的嵌套包含时,我必须在where子句中使用OR。 我有一个ActiveRecord查询,如下所示:Ruby on rails 或在使用嵌套包含或关联联接时在where子句中,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,Ruby On Rails 3.2,当使用关联的嵌套包含时,我必须在where子句中使用OR。 我有一个ActiveRecord查询,如下所示: Inventory.includes(:category,:inventory_tiers,:modifiers=>[:modifier_measures,:modifier_tiers]) .where( :categories => { category_tag: 'Dry'}, :location_id =>12, :invento
Inventory.includes(:category,:inventory_tiers,:modifiers=>[:modifier_measures,:modifier_tiers])
.where(
:categories => { category_tag: 'Dry'},
:location_id =>12,
:inventory_tiers => {:tier => 1}),
modifiers: {category_tag:"Wet"},
modifier_tiers: {tier:1}
)
其中where子句使用和,适用于所有条件。
但我想在最后两个条件中使用OR,比如:
Inventory.includes(:category,:inventory_tiers,:modifiers=>[:modifier_measures,:modifier_tiers]).where("categories.category_tag=? AND location_id=? AND inventory_tiers.tier = ? OR modifiers.category_tag=? OR modifier_tiers.tier=?", "Wet",12,1,"Wet",1).select("inventories.id,inventories.name,inventories.photo,inventory_tiers.sell_price, modifiers.id,modifiers.name,modifiers.price,modifier_measures.id as measure_id,modifier_measures.name as measure,modifier_measures.price as measure_price,modifier_measures.measure_value")
Inventory.includes(:category, :inventory_tiers, modifiers: [:modifier_measures, :modifier_tiers])
.where(categories: { category_tag: 'Dry' }, location_id: 12, inventory_tiers: { tier: 1 })
.where(Modifier.arel_table[:category_tag].eq("Wet").or(ModifierTier.arel_table[:tier].eq(1)))
但它不起作用。
如何重写语法?如前所述,在不知道您使用的Rails的实际版本的情况下,我假设它是Rails 3。。。在这种情况下,我建议使用Arel。比如:
Inventory.includes(:category,:inventory_tiers,:modifiers=>[:modifier_measures,:modifier_tiers]).where("categories.category_tag=? AND location_id=? AND inventory_tiers.tier = ? OR modifiers.category_tag=? OR modifier_tiers.tier=?", "Wet",12,1,"Wet",1).select("inventories.id,inventories.name,inventories.photo,inventory_tiers.sell_price, modifiers.id,modifiers.name,modifiers.price,modifier_measures.id as measure_id,modifier_measures.name as measure,modifier_measures.price as measure_price,modifier_measures.measure_value")
Inventory.includes(:category, :inventory_tiers, modifiers: [:modifier_measures, :modifier_tiers])
.where(categories: { category_tag: 'Dry' }, location_id: 12, inventory_tiers: { tier: 1 })
.where(Modifier.arel_table[:category_tag].eq("Wet").or(ModifierTier.arel_table[:tier].eq(1)))
我还没有对此进行测试,但上面的内容应该会让您走上正确的道路。如前所述,在不知道您正在使用的Rails的实际版本的情况下,我假设它是Rails 3。。。在这种情况下,我建议使用Arel。比如:
Inventory.includes(:category,:inventory_tiers,:modifiers=>[:modifier_measures,:modifier_tiers]).where("categories.category_tag=? AND location_id=? AND inventory_tiers.tier = ? OR modifiers.category_tag=? OR modifier_tiers.tier=?", "Wet",12,1,"Wet",1).select("inventories.id,inventories.name,inventories.photo,inventory_tiers.sell_price, modifiers.id,modifiers.name,modifiers.price,modifier_measures.id as measure_id,modifier_measures.name as measure,modifier_measures.price as measure_price,modifier_measures.measure_value")
Inventory.includes(:category, :inventory_tiers, modifiers: [:modifier_measures, :modifier_tiers])
.where(categories: { category_tag: 'Dry' }, location_id: 12, inventory_tiers: { tier: 1 })
.where(Modifier.arel_table[:category_tag].eq("Wet").or(ModifierTier.arel_table[:tier].eq(1)))
我还没有对此进行测试,但上面的内容应该会让您走上正确的道路。首先,有很多不同版本的rails标签,您实际运行的是哪个版本。也就是说,您必须使用字符串where来表示或部分。除了您可能缺少一些参数之外,还有什么是不起作用的?您实际使用的Rails版本是什么?请清理标签。什么是“不工作”?错误消息?预期行为?实际行为?首先,有很多不同版本的rails标签,您实际运行的是哪个版本。也就是说,您必须使用字符串where来表示或部分。除了您可能缺少一些参数之外,还有什么是不起作用的?您实际使用的Rails版本是什么?请清理标签。什么是“不工作”?错误消息?预期行为?实际行为?