Ruby on rails Ruby Activerecord:在多个字段中查找相同的值
我在SQL中使用以下查询在模型的多个字段中查找相同的值,但希望以更正确的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) 有什么建议吗? 出于好奇:如果我使用
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是最好的方法。:)