【问题标题】:Combining meta_search with acts_as_taggable_on将 meta_search 与acts_as_taggable_on 相结合
【发布时间】:2011-08-11 14:33:06
【问题描述】:

我在我正在开发的 Rails 3 网站的一些搜索功能上遇到了一个小问题。我有一个简单的Post 模型,看起来像这样:

class Post < ActiveRecord::Base
  acts_as_taggable
end

我正在使用acts_as_taggable_on 来更轻松地为我的帖子添加标签。当我有一个标记为“rails”的帖子并执行以下操作时,一切正常:

@posts = Post.tagged_with("rails")

问题是,我也想搜索帖子的标题。当我有一篇标题为“Hello world”并标记为“rails”的帖子时,我希望能够通过搜索“hello”“rails”找到该帖子。所以我想要一个标题列的LIKE 语句以及acts_as_taggable_on 提供的tagged_with 方法。 where 范围不起作用,因为它使用 AND 而不是 OR

我希望meta_search 能解决问题,但这对我不起作用。我尝试了几件事。以下是我尝试过的两个示例:

@search = Post.search(:tagged_with_or_title_like => params[:search])
@search = Post.search(:title_like => params[:search], :tagged_with => params[:search])

它只是无法识别“tagged_with”。这是我第一次使用meta_search,所以我可能在这里做错了。 ;) 我在某处读到 searchlogicacts_as_taggable_on 结合使用,但由于它不支持 Rails 3,我不能使用它。

我希望这里有人可以帮助我解决这个问题。有人知道如何将acts_as_taggable_onmeta_search 结合起来吗?或者也许知道没有meta_search 的解决方案?另外,如果acts_as_taggable_on 有更好的选择,可以与meta_search 一起使用,我也很想听听。 :)

编辑: 我在不使用tagged_withmeta_search 的情况下让它工作。它看起来像这样:

Post.select("DISTINCT posts.*").joins(:base_tags).where("posts.title LIKE ? OR tags.name = ?", "%"+params[:search]+"%", params[:search])

创建的查询很荒谬,所以我尝试了不同的方法:没有acts_as_taggable_onmeta_search。我自己创建了一个标签表,并使用has_and_belongs_to_many 将其连接到帖子。我不会有其他需要连接到标签的表,所以这对我有用。我创建了一个搜索标签和标题的范围:

scope :search, lambda { |search| select("DISTINCT posts.*").joins(:tags).where("posts.title LIKE ? OR tags.name = ?", "%"+search+"%", search) }

现在我可以执行以下操作:

Post.search(params[:search])

效果很好,查询也很好。不过,如果有人知道更好的方法:请告诉我。它也可能对通过 Google 来这里的人有所帮助。

【问题讨论】:

  • 我用我的解决方法更新了这个问题。我最终放弃了acts_as_taggable 和meta_search。也许你可以试试 Serge 的回答。如果有效,我会将其标记为已回答。 :)

标签: ruby-on-rails ruby acts-as-taggable-on meta-search


【解决方案1】:

我认为您正在研究的解决方案是使用数据库 VIEW 作为新模型。

您可以创建包含联接表 Post 和 Tags 的视图。

然后你可以搜索它,使用 meta_search 没有问题。

【讨论】:

    【解决方案2】:
    Post.metasearch({:title_or_tag_taggings_tag_name_contains => params[:search]})
    

    享受

    【讨论】:

    • 我刚刚测试了这是否适用于我的旧项目并且有效!所以我将此标记为已回答。谢谢你。 :)
    猜你喜欢
    • 2019-12-02
    • 2012-05-19
    • 2020-05-04
    • 1970-01-01
    • 2014-10-23
    • 2011-11-13
    • 2013-04-13
    • 2017-01-03
    • 1970-01-01
    相关资源
    最近更新 更多