是否可以使用'或'语句执行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]
谢谢!
答案 0 :(得分:9)
不使用Activerecord方法
这可能有效:
code = params[:code]
@product = Product.find(:all, :conditions => ["upc = ? or cspc = ?", code, code])
答案 1 :(得分:5)
清理尼古拉斯代码:
@products = Product.all(:conditions => ["upc = :code or cspc = :code", {:code => params[:code]}])
答案 2 :(得分:3)
从Rails 5开始,一种方法如下:
对于第一个匹配的记录:
public class SqlServerDatabaseRepository
{
readonly string _connectionString;
public SqlServerDatabaseRepository(string connectionString)
{
_connectionString = connectionString;
}
public void ExecuteUserLogs(string userId, /* additional parameters */)
{
using(var connection = new SqlConnection(_connectionString)
{
//use your connection here to execute your command
} //here the connection falls out of scope so the using statement will handle disposing it for you
}
}
对于所有匹配的记录:
Product.find_by("upc = ? OR cspc = ?", params[:code], params[:code])
答案 3 :(得分:2)
如果你在Rails 3上使用Arel:
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
答案 4 :(得分:1)
据我所知,Rails不支持自动OR查找器,开箱即用。但searchlogic
gem似乎支持此功能。见here
答案 5 :(得分:1)
之前我遇到过类似的问题。
接近它的一种方法是尝试找出您首先获得的数据类型。写一些会告诉你差异的代码。
也许看看是否有正则表达式来区分UPC和CSPC。
答案 6 :(得分:1)
从 Rails 6 开始,ActiveRecord 有一个 or
操作符。
它不像您期望的那样工作,因为您需要在 or
中创建一个全新的查询。但最好避免需要原始 SQL。
Person.where(first_name: "John").or(Person.where(last_name: "Smith"))
这会在后台生成以下 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]]