活动记录按列"OR"轨道查找

Kev*_*tre 4 ruby-on-rails

是否可以使用'或'语句执行find_by查询?例如:

@product ||= Product.find_by_upc(params[:code]) if params[:code]
@product ||= Product.find_by_cspc(params[:code]) if params[:code]
Run Code Online (Sandbox Code Playgroud)

像(不起作用):

@product ||= Product.find_by_upc_or_cspc(params[:code]) if params[:code]
Run Code Online (Sandbox Code Playgroud)

谢谢!

nic*_*ick 9

不使用Activerecord方法

这可能有效:

code = params[:code]
@product = Product.find(:all, :conditions => ["upc = ? or cspc = ?", code, code])
Run Code Online (Sandbox Code Playgroud)


jay*_*qui 7

从Rails 5开始,一种方法如下:

对于第一个匹配记录:

Product.find_by("upc = ? OR cspc = ?", params[:code], params[:code])
Run Code Online (Sandbox Code Playgroud)

对于所有匹配的记录:

Product.where("upc = ? OR cspc = ?", params[:code], params[:code])
Run Code Online (Sandbox Code Playgroud)


Oma*_*shi 6

清理尼古拉斯的代码:

@products = Product.all(:conditions => ["upc = :code or cspc = :code", {:code => params[:code]}])
Run Code Online (Sandbox Code Playgroud)


pap*_*ppy 5

从 Rails 6 开始,ActiveRecord 有一个or运算符。

它并不完全按照您的预期工作,因为您需要在or. 但最好避免需要原始 SQL。

Person.where(first_name: "John").or(Person.where(last_name: "Smith"))
Run Code Online (Sandbox Code Playgroud)

这会在后台生成以下 SQL。

SELECT "people".* FROM "people" WHERE ("people"."first_name" = $1 OR "people"."last_name" = $2) LIMIT $3
[["first_name", "John"], ["last_name", "Smith"], ["LIMIT", 11]]
Run Code Online (Sandbox Code Playgroud)