Ruby Activerecord:在多个字段中找到相同的值

时间:2018-05-15 14:49:59

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

有什么建议吗? 出于好奇:如果我使用第一个(有效)并使用putsp来查看结果,我会看到两次结果?我想知道为什么..

在这个例子中的编辑我只使用了两个字段,但实际上可能会有更多这样或者不可行而且不干燥

4 个答案:

答案 0 :(得分:3)

有一种IF (EXISTS(SELECT TOP 1 1 FROM sys.sql_logins WHERE [name] = '<login>')) DROP LOGIN [<login>]; 方法可用...

or

您可以执行的多个字段

MyModel.where(a_field: 'some_value').or(MyModel.where(another_field: 'some_value')).first.try(:id)

答案 1 :(得分:2)

Ransack是一个用于构建复杂查询的gem。

它支持orand运营商。

要搜索具有相同值的多个列,您可以按以下方式构建ransack查询。

MyModel.ransack(field1_or_field2_or_field3_eq: 'some_value')

Ransack提供各种选项来获得你的结果(equal_to condition,like_condition等...)。

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

答案 2 :(得分:2)

Myltiple方法:

Rails:

Post.where('id = 1').or(Post.where('id = 2'))

参考:https://github.com/rails/rails/commit/9e42cf019f2417473e7dcbfcb885709fa2709f89

使用rais_or Gem: https://github.com/khiav223577/rails_or

EX: user = User.where(account: account).or(email: account).take

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

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

答案 3 :(得分:0)

我忘记了这个问题,这是我现在的处理方法

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

您只需要这样称呼

Model.search_in_all_fields "test"

在开始..之前,请确保这里没有更好的SQL注入

class Model < ActiveRecord::Base
  scope :search_all_fields, ->(text){
    where("#{column_names.join(' || ')} like ?", "%#{text}%")
  }
end