我在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)
有什么建议吗?
出于好奇:如果我使用第一个(有效)并使用puts
或p
来查看结果,我会看到两次结果?我想知道为什么..
在这个例子中的编辑我只使用了两个字段,但实际上可能会有更多这样或者不可行而且不干燥
答案 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。
它支持or
和and
运营商。
要搜索具有相同值的多个列,您可以按以下方式构建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