假设我有几个问题上面有多个标签。我希望能够通过标签找到相关的问题(类似于iTunes Genius),或者根据共享的问题找到标签的相关标签。
不幸的是,我不知道该怎么做。尤其是涉及到相关标签时。
我希望有人能给我一个提示!谢谢!

最佳答案

有效地实现这一点需要对sql有很强的理解。您可以使用activerecord帮助构建查询,但策略实际上在于将生成的sql查询。
假设您有一个QuestionTag连接模型的has-many-through关系的标记和问题模型:

class Question < ActiveRecord::Base
  has_many :question_tags
  has_many :tags, :through => :question_tags
end

class Tag < ActiveRecord::Base
  has_many :question_tags
  has_many :questions, :through => :question_tags
end

class QuestionTag < ActiveRecord::Base
  belongs_to :question
  belongs_to :tag
end

您可以这样做来查找与特定标记匹配的问题:
tag = Tag.find_by(name: 'foo')
related_questions = tag.questions

您还可以找到与一组标记匹配的问题:
tag_names = ['foo', 'bar', 'baz']
subquery = QuestionTag.joins(:tag).
             select('question_tags.question_id').
             where(tags: {name: tag_names}).
             group('question_tags.question_id').
             having("COUNT(*) = #{tag_names.size}").to_sql
related_questions = Question.where("id IN (#{subquery})")

您可以找到与特定标记相关的标记,如下所示:
tag = Tag.find_by(name: 'foo')
subquery = tag.question_tags.select('question_tags.question_id').to_sql
related_tags = Tag.joins(:question_tags).
                 where("question_tags.question_id IN #{subquery}").
                 where.not(id: tag.id)

关于ruby-on-rails - Ruby中按协会的相关内容(在轨),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21443121/

10-14 23:03