Поиск активной записи по столбцам 'ИЛИ' Rails - PullRequest
4 голосов
/ 27 июля 2010

Можно ли выполнить запрос find_by с помощью оператора 'или'? Например:

@product ||= Product.find_by_upc(params[:code]) if params[:code]
@product ||= Product.find_by_cspc(params[:code]) if params[:code]

Как что-то вроде (не работает):

@product ||= Product.find_by_upc_or_cspc(params[:code]) if params[:code]

Спасибо!

Ответы [ 6 ]

9 голосов
/ 27 июля 2010

Не использовать методы Activerecord

Это может работать:

code = params[:code]
@product = Product.find(:all, :conditions => ["upc = ? or cspc = ?", code, code])
5 голосов
/ 27 июля 2010

Код очистки Николая:

@products = Product.all(:conditions => ["upc = :code or cspc = :code", {:code => params[:code]}])
4 голосов
/ 25 мая 2018

Начиная с Rails 5, один из способов сделать это выглядит следующим образом:

Для первой соответствующей записи:

Product.find_by("upc = ? OR cspc = ?", params[:code], params[:code])

Для всех подходящих записей:

Product.where("upc = ? OR cspc = ?", params[:code], params[:code])
2 голосов
/ 27 июля 2010

Если вы используете Arel на Rails 3:

t = Product.arel_table

@products = Product.where(
  t[:upc].eq(params[:code])       \
  .or(t[:cspc].eq(params[:code]))
)

@product = @products.first if @products.size == 1
1 голос
/ 27 июля 2010

У меня была похожая проблема, как эта раньше.

Один из подходов к этому - попытаться выяснить, какой тип данных вы получаете в первую очередь. Напишите некоторый код, который скажет вам разницу.

Может быть, посмотреть, есть ли способ регулярного выражения для различия между UPC и CSPC.

1 голос
/ 27 июля 2010

Насколько я знаю, Rails не поддерживает автоматические искатели ИЛИ из коробки. Но камень searchlogic поддерживает эту функцию. Смотри здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...