#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 при работе с вложенными включениями с ассоциацией. У меня есть запрос ActiveRecord следующим образом:
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 использует И для всех условий.
но я хочу использовать ИЛИ для последних двух условий, что-то вроде:
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")
но это не работает.
Как я могу переписать синтаксис?
Комментарии:
1. прежде всего, это множество тегов rails для разных версий, какую версию вы на самом деле используете. при этом вам придется использовать строку where для части or. что не работает в этом, кроме того, что вам, вероятно, не хватает некоторых скобок
2. Какую версию Rails вы на самом деле используете? Пожалуйста, очистите теги.
3. Что такое «не работает»? Сообщения об ошибках? Ожидаемое поведение? Фактическое поведение?
Ответ №1:
Как указано, не зная фактической версии Rails, которую вы используете, я предположу, что это Rails 3… В этом случае я бы предложил использовать Arel. Что-то вроде:
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)))
Я не тестировал это, но вышесказанное должно направить вас на правильный путь.