关联在Ruby中的相关内容(在轨道上)

时间:2014-01-29 21:34:12

标签: ruby-on-rails ruby associations

假设我的问题有多个标签。我希望能够通过标签(类似于例如iTunes Genius)找到相关问题,或者根据共享它们的问题找到标签的相关标签。

不幸的是,我不知道如何做到这一点。特别是涉及相关标签时。

我希望有人能给我一个提示!非常感谢!

2 个答案:

答案 0 :(得分:3)

有效地完成此任务需要对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)

答案 1 :(得分:1)

您所描述的是多对多关系,这意味着问题可以包含许多标签和标签。要做到这一点,你必须创建一个由tag_ids和question_ids组成的第三个表来执行此操作,您需要阅读活动记录关联。特别是有很多通过关联。 http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association 我目前正在参加一个网络开发课程,我们昨天在这里学习和上课,这是我们的笔记。通过创建模型并使用它们,我怀疑它对你真的很有帮助。 https://github.com/wdi-sf-jan-2014/notes/blob/master/active_record_associations/migrations_and_associations.md