活动记录按列“OR”轨道查找

时间:2010-07-26 20:46:56

标签: 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]

像(不起作用):

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

谢谢!

7 个答案:

答案 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]]