ruby-on-rails - Ruby 中 Association 的相关内容 (on Rails)

标签 ruby-on-rails ruby associations

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

不幸的是,我不知道该怎么做。特别是当涉及到相关标签时。

希望有人能给我指点!非常感谢!

最佳答案

有效地完成此任务需要对 SQL 有深入的了解。您可以使用 ActiveRecord 来帮助您构建查询,但策略实际上在于将生成的 SQL 查询。

假设您有标签和问题模型,以及用于 has-many-through 关系的 QuestionTag 连接模型:

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 中 Association 的相关内容 (on Rails),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21443121/

相关文章:

ruby - 在 Ruby 中,如何从散列输出 json 并给它换行和制表符

ruby - 用于在独立线程中运行服务器然后在任务完成时终止线程的 Rake 任务?

ruby-on-rails - 使用关联 rails 找到最大值的正确方法

ruby-on-rails - 如何按多个字段对 Ruby 可枚举/数组进行分组?

ruby-on-rails - 如何获取 Redis 中的所有设置键按其 SCARD 排序?

ruby-on-rails - Ruby On Rails 不会加载@content_for_layout

associations - 类图中关联多重性的重要性是什么?

c# - UML to C# 中的箭头和闭合箭头有什么区别?

ruby-on-rails - 集成到 Rails 中的票务系统

ruby-on-rails - 有没有一种 RAILS 方法可以干燥邮件程序操作/ View ?