【问题标题】:Rails filter by SQL search in different modelRails 通过不同模型中的 SQL 搜索过滤
【发布时间】:2011-11-06 18:05:34
【问题描述】:

在我的照片视图中,有一个使用 text_field 进行搜索的选项。我想通过单击预定义的标签来添加“搜索”选项。也许search 不是最好的方法。

这是我模型中的搜索方法:

def self.search(search)
  if search
    where('name or description or tag.name LIKE ?', "%#{search}%")
  else
    scoped
  end
end

我也不确定我是否正确调用它...但这些是我在照片的索引视图中创建的链接:

<% @tags.each do |tag| %>
  <%= link_to tag.name, :search => tag.name, :class => "tag" %>
<% end %>

Tags 不在照片表中,但与照片有 HABTM 关系。我通常可以用@photo.tags.name 或类似的东西来称呼他们。 无论如何,当我单击一个标签时,它会返回一个SQLite3::SQLException: no such column: tag.name: SELECT COUNT(*) FROM "photos" WHERE (name or description or tag.name LIKE '%landscape%')。有什么想法吗?也许一开始有更好的方法来做到这一点?

【问题讨论】:

    标签: sql ruby-on-rails-3 filtering


    【解决方案1】:

    为了通过标签表中的字段查找,您必须与其进行连接。让它改变你的搜索方法:

    def self.search(search)
      if search
        joins(:tags).where('name or description or tags.name LIKE ?', "%#{search}%")
      else
        scoped
      end
    end
    

    【讨论】:

    • 太棒了!这行得通,但我必须删除name or description,因为它们是照片字段,而不是标签字段。我是否需要为标签搜索创建单独的方法,或者我可以指定tags.nametags 表中,而name or description 在照片表中?
    • 如果这些字段在不同的表中,您可以这样做,但只是为了确保您可以做到这一点joins(:tags).where('photos.name or photos.description or tags.name LIKE ?', "%#{search}%")
    • 谢谢,这似乎可以解决问题。有趣的是,现在有一张特定的照片在任何搜索的结果中出现了 5 倍!真奇怪。我会试着找出原因。
    【解决方案2】:

    为常见问题提供自己的解决方案是一种很好的学习方式,但是,我建议您将标签工作委托给专门的 gem,例如:https://github.com/mbleigh/acts-as-taggable-on,这样您就可以专注于您的业务。

    此外,使用关系模型来保存标签有点过头了:在大多数情况下,以逗号分隔的标签列表就足够了。

    【讨论】:

    • 是的,我确实选择手动构建标签只是为了了解它是如何工作的;但也许将它切换为宝石会更理想......
    猜你喜欢
    • 2023-04-04
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2018-12-15
    • 2014-05-31
    相关资源
    最近更新 更多