【问题标题】:How to pull entries from a model based off their associated data? (Rails)如何根据相关数据从模型中提取条目? (导轨)
【发布时间】:2012-01-08 17:15:55
【问题描述】:

假设我有一个讨论模型,并且可以标记一个讨论。这些标签通过标签表与讨论相关联。

我想定义一个基本上可以做到的方法 .tagged_with(tag):

 def tagged_with

      Discussion.where(#something about tags include the tag given)
 end

我确实已经设置了一些可能有用的方法。例如,我有 tag_list

 def tag_list
     tags.map(&:name).joins(", ") #my tags are separated by commas, not spaces)
 end

如果有人知道基于一个标签修剪讨论模型的简单问题的答案,我如何将其扩展为更具适应性 - 例如,接受多个标签的参数,并能够指定任何或者所有都是必要的。例如:

 Discussion.tagged_with(tag1, tag2, :any => true)

仅供参考来自协会的一些代码:

has_many :taggings, :as => :taggable
has_many :tags, :through => :taggings, :source => :tag, :source_type => "Tag"

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 tags tagging


    【解决方案1】:

    您应该能够通过其 has_many 关系将标签表加入您的讨论查询。 Discussion.joins(:tags).where(:tags => {:name => array_of_tags}).

    使用下面的方法定义,您可以执行Discussion.tagged_with(['foo', 'bar'])Discussion.tagged_with('foo') 之类的操作。

    def self.tagged_with(tag_or_tags)
      joins(:tags).where(:tags => {:name => tag_or_tags})
    end
    

    【讨论】:

    • 只是为了了解更多,你知道在这种方法中你会如何按匹配标签的数量排序吗? IE 如果我搜索“Foo”和“Bar”,我将如何增强它以使与 foo 和 bar 的讨论高于任何一个标记的讨论?
    • 嗯。从理论上讲,您可以执行一些粗糙的 SQL 来更改结果中的顺序,但在 Ruby 中进行排序可能更明智。如果您希望返回数百或更多的讨论,最好在数据库中以某种方式进行;如果您的数量减少,则可能不值得该查询所需的丑陋。
    • +1 谢谢 pbyrne,这正是我想要的。您将如何进行相反的查询,以找到标签不在 array_of_tags 中的讨论?
    • @dj:我认为您应该可以这样做(未在控制台中测试,因此无法保证它会起作用):Discussion.joins(:tags).where("tags.name not in (?)", array_of_tags)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 2012-06-22
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多