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