Ruby on rails Ruby Activerecord:在多个字段中查找相同的值

Ruby on rails Ruby Activerecord:在多个字段中查找相同的值,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我在SQL中使用以下查询在模型的多个字段中查找相同的值,但希望以更正确的Activerecord方式进行 MyModel.where("'some_value' in (a_field, another_field)").first.try(:id) 以下内容不起作用,因为它是AND,我需要OR MyModel.where(a_field: 'some_value', another_field: 'some_value').first.try(:id) 有什么建议吗? 出于好奇:如果我使用

我在SQL中使用以下查询在模型的多个字段中查找相同的值,但希望以更正确的Activerecord方式进行

MyModel.where("'some_value' in (a_field, another_field)").first.try(:id)
以下内容不起作用,因为它是AND,我需要OR

MyModel.where(a_field: 'some_value', another_field: 'some_value').first.try(:id)
有什么建议吗? 出于好奇:如果我使用第一个(有效)并使用
put
p
查看结果,我会看到两次结果吗?我想知道为什么


编辑在本例中,我只使用了两个字段,但实际上可能会有更多字段,因此or不可行且不干燥

有一个
方法可用

MyModel.where(a_field: 'some_value').or(MyModel.where(another_field: 'some_value')).first.try(:id)
对于多个字段,您可以执行以下操作

test_value = 'some_value'

my_models = MyModel.where(id: nil)

%i(a_field another_field third_field fourth_field fifth_field).each do |field|
  my_models = my_models.or(MyModel.where(field => test_value))
end

有一个
方法可用

MyModel.where(a_field: 'some_value').or(MyModel.where(another_field: 'some_value')).first.try(:id)
对于多个字段,您可以执行以下操作

test_value = 'some_value'

my_models = MyModel.where(id: nil)

%i(a_field another_field third_field fourth_field fifth_field).each do |field|
  my_models = my_models.or(MyModel.where(field => test_value))
end
是一个用于构建复杂查询的gem

它同时支持
运算符

为了搜索具有相同值的多个列,可以按照以下方式构建ransack查询

MyModel.ransack(field1\u或field2\u或field3\u eq:'some\u value')

Ransack提供各种选项以获得您的结果,如(等于条件,如条件等)

如果您不想使用任何外部gem,那么我认为@steve的答案是合适的。

是一种用于构建复杂查询的gem

它同时支持
运算符

为了搜索具有相同值的多个列,可以按照以下方式构建ransack查询

MyModel.ransack(field1\u或field2\u或field3\u eq:'some\u value')

Ransack提供各种选项以获得您的结果,如(等于条件,如条件等)


如果你不想使用任何外部宝石,那么我认为@steve的答案是合适的。

我有以下几种方法:

轨道:

Post.where('id = 1').or(Post.where('id = 2'))
参考文献:

使用rais\u或Gem:

使用ARel#ARel最适合复杂查询

t = Post.arel_table
results = Post.where(
  t[:author].eq("Someone").
  or(t[:title].matches("%something%"))
)

我有以下几种方法:

轨道:

Post.where('id = 1').or(Post.where('id = 2'))
参考文献:

使用rais\u或Gem:

使用ARel#ARel最适合复杂查询

t = Post.arel_table
results = Post.where(
  t[:author].eq("Someone").
  or(t[:title].matches("%something%"))
)

我忘了这个问题,我现在是怎么做的

def search_in_all_fields model, text
  model.where(
    model.column_names
      .map {|field| "#{field} like '%#{text}%'" }
      .join(" or ")
  )
end
或者更好地作为模型本身的范围

class Model < ActiveRecord::Base
  scope :search_in_all_fields, ->(text){
    where(
      column_names
        .map {|field| "#{field} like '%#{text}%'" }
        .join(" or ")
    )
  }
end
在开始之前,请确保这里没有sql注入,而且更好、更短

class Model < ActiveRecord::Base
  scope :search_all_fields, ->(text){
    where("#{column_names.join(' || ')} like ?", "%#{text}%")
  }
end
类模型(文本){
其中(“#{column_names.join('||')}like?”,“%#{text}%”)
}
终止

我忘记了这个问题,下面是我现在的做法

def search_in_all_fields model, text
  model.where(
    model.column_names
      .map {|field| "#{field} like '%#{text}%'" }
      .join(" or ")
  )
end
或者更好地作为模型本身的范围

class Model < ActiveRecord::Base
  scope :search_in_all_fields, ->(text){
    where(
      column_names
        .map {|field| "#{field} like '%#{text}%'" }
        .join(" or ")
    )
  }
end
在开始之前,请确保这里没有sql注入,而且更好、更短

class Model < ActiveRecord::Base
  scope :search_all_fields, ->(text){
    where("#{column_names.join(' || ')} like ?", "%#{text}%")
  }
end
类模型(文本){
其中(“#{column_names.join('||')}like?”,“%#{text}%”)
}
终止

“我需要一个OR”-这里是:@lacostenycoder的可能重复问题不是为了一个OR,而是为了更好的activerecord方式,如果有多个字段或没有好的“我需要一个OR”-这里是:@lacostenycoder的可能重复问题不是为了一个OR,而是为了更好的activerecord方式,如果有多个字段,或者没有好的地方,Steve,在我的例子中是可以使用的,但事实上有多个字段,而且它不是干的,如果没有更好的建议,我将接受,并将不得不接受我编辑的SQL解决方案,以建议一种方法可以为多个字段执行此操作。我无法测试此链接,但它应该可以工作?不过,有时候SQL是最好的方法。:)thx Steve,在我的示例中,这是可以使用的,但事实上,有多个字段,而且它不是干的,如果没有更好的建议,我将接受,并且将不得不接受我编辑的SQL解决方案,以建议一种可以对多个字段执行的方法。我无法测试此链接,但它应该可以工作?不过,有时候SQL是最好的方法。:)