对于任何包含特定文本字段的记录,是否有一种查询Rails数据库的简便方法?我知道我可以使用.where("field_name LIKE ?", "my text")
对每个字段进行编码,但是我有几个字段,我想知道是否有更短的方法可以做到这一点。
提前致谢。
答案 0 :(得分:4)
我不知道这样做的框架方式。您可以使用
编写代码my_attributes = YourModel.attributes
# delete attributes you do not need, like `id` etc.
# or just create an array with your desired attributes,
# whichever way is faster
queries = my_attributes.map { |attr| "#{attr} LIKE %insert_your_text_here%" }
# Do not use this if the text your looking for is provided by user input.
built_query = queries.join(" OR ")
YourModel.where(built_query)
这可以让您更接近目标。如果这对您有意义,请告诉我。
编辑:答案https://stackoverflow.com/a/49458059/299781提到了Ransack。这是一个很好的宝石,可以减轻你的负担。使它更容易,更好,表现更好:D
很高兴你喜欢这个,但是如果你把用户输入作为你正在寻找的文本,请注意你的应用程序打开sql注入。 (使用此解决方案) Ransack会减轻这一点。
答案 1 :(得分:0)
如果您想要基于params的完整誓言文本搜索,那么您可以使用ransack gem
答案 2 :(得分:0)
class MyModel
scope :search_like, -> (field_name, search_string) {where("#{field_name} LIKE ?", "%#{search_string}%")}
end
然后你可以这样称呼它:
MyModal.search_like('name', 'foobar')
更新基于@holgar的答案,但要注意如果没有编入索引,这些搜索在大型数据集上可能会很慢:
class MyModel
def self.multi_like(search_string)
my_attributes = [:first_name, :last_name] # probalby only use string fields here
queries = my_attributes.map { |attr| "#{attr} LIKE '%#{search_string}%'" }
where(queries.join(" OR "))
end
end