Sql Rails:跨多个关联获取模型

Sql Rails:跨多个关联获取模型,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我试着将我的思想集中在如何导航我想要的关联上,但我似乎无法理解。我正在尝试获取所有帖子的标签。每篇文章目前都有一个标题和正文,它们都表示为TaggedText。每个TaggedText都可以有许多独特的标记,比如在Facebook帖子中标记多个人/页面(保存实例时在模型中强制实施唯一性) 要使查询正常工作,我缺少什么?或者我应该以某种方式重新构造模型和关联吗?当您出现错误状态时,您需要向您的Post模型添加标记范围关联。我还添加了一些您可能会觉得有用或不有用的关联,这些关联将大大简化您的查询。并

我试着将我的思想集中在如何导航我想要的关联上,但我似乎无法理解。我正在尝试获取所有
帖子
标签
。每篇文章目前都有一个标题和正文,它们都表示为
TaggedText
。每个TaggedText都可以有许多独特的标记,比如在Facebook帖子中标记多个人/页面(保存实例时在模型中强制实施唯一性)


要使查询正常工作,我缺少什么?或者我应该以某种方式重新构造模型和关联吗?

当您出现错误状态时,您需要向您的
Post
模型添加
标记范围
关联。我还添加了一些您可能会觉得有用或不有用的关联,这些关联将大大简化您的查询。并不是说你的
TagRange
类的关联就这么好

class Tag < ActiveRecord::Base
  has_many :tag_ranges # need this association in order to get tagged_texts
  has_many :tagged_texts, through: :tag_ranges
  has_many :posts, -> { uniq }, through: :tagged_texts # posts with the given tag
end

class Post < ActiveRecord::Base
  has_many :tagged_texts
  has_many :tag_ranges, through: :tagged_texts # Post now has association named 'tagged_ranges'
  has_many :tags, ->  { uniq }, through: :tag_ranges # tags that given post has
end

class TaggedText < ActiveRecord::Base
  has_many :tag_ranges # all tag ranges for a tag text
  has_many :tags, through: :tag_range
  belongs_to :post
end

希望这有帮助

太棒了,效果很好。谢谢你,乔!出于好奇,lambda在做什么:
->{uniq}
?这仅仅是对系统的一个“提示”,还是ActiveRecord实际上强制执行了什么?我从来没有见过lambda文档,你能找到它文档的链接吗?另外,在
标记中,你添加了关联
有很多:标记范围
,这显然得到了
标记文本
…为什么该关联得到了
标记文本
,而
有很多:标记文本,through::tag_ranges
没有?我还没有找到
->{}
的官方文档,它被称为作用域块,但您可以在中找到一些有关它的信息。它本质上是为你的关联定义一个范围。在这种情况下,这意味着当获取此帖子的标签时,只返回唯一的标签。至于
有很多:标签范围
,我的评论有点混乱,但我的意思是,如果没有
有很多:标签范围
行,你就不能使用
有很多:标签范围
,通过::标签范围
,因为您的标记对象将不知道它的
tag\u范围是什么。希望现在情况更清楚了。还请注意,我更新了
Post
模型中的
has\u many:tags
行,因为它是
通过:taged\u text
更新的,而它本应该是
通过:taged\u ranges
更新的,现在是。欢迎您!我很乐意帮忙。谢谢你修复了我的多个语法错误哈哈哈!
def get_posts_by_tag(tag, page, posts_per_page)
Post
  .joins(:tagged_texts)
  .joins(:tag_ranges)
  .joins(:tags)
  .where('tag.id = ?', tag.id)
  .uniq
  .limit(posts_per_page)
  .offset(page - 1)
  .to_a
end
class Tag < ActiveRecord::Base
  has_many :tag_ranges # need this association in order to get tagged_texts
  has_many :tagged_texts, through: :tag_ranges
  has_many :posts, -> { uniq }, through: :tagged_texts # posts with the given tag
end

class Post < ActiveRecord::Base
  has_many :tagged_texts
  has_many :tag_ranges, through: :tagged_texts # Post now has association named 'tagged_ranges'
  has_many :tags, ->  { uniq }, through: :tag_ranges # tags that given post has
end

class TaggedText < ActiveRecord::Base
  has_many :tag_ranges # all tag ranges for a tag text
  has_many :tags, through: :tag_range
  belongs_to :post
end
def get_posts_by_tag(tag, page, posts_per_page)
  tag.posts.limit(posts_per_page).offset(page - 1).to_a
end