2

我不知道答案的简单任务:

我有 3 个模型:主题、页面和子页面

topics   has_many pages
pages    has_many subpages
pages    belongs_to topics
subpages belongs_to pages

我根据 URL slug 查找主题:

@topic = Topic.find_by_slug(params[:topic])

现在我想访问所有与主题相关的子页面,所以实际上我想“跳过”这些页面。

@subpages = Subpage.where(topic => @topic)

该查询的外观如何?

谢谢你的帮助。

4

1 回答 1

2

您可以使用“通过”声明您的关系:

Subpage
  belongs_to :page
  has_one :topic, through: :page

Page
  has_many :subpages
  belongs_to :topic

Topic
  has_many :pages
  has_many :subpages, through: :pages

然后包含它并对其设置条件:

Subpage.includes(:topic).where(topics: { title: 'Hello World!' })

在你的情况下

@subpages = Subpage.includes(:topic).where(topics: { id: @topic.id })

对于记录.includes(),您必须在&方法中使用关系的名称.joins(),我们在 where 子句中使用复数(以匹配表的名称):

如果用户属于_to :post

User.includes(:post).where(posts: { title: 'Post #1' })
                 #^ No plural #^ Always use the plural in the where clause

如果用户 has_many :posts

User.includes(:posts).where(posts: { title: 'Post #1' })
                 #^^ Plural because has_many :posts
于 2013-11-05T19:42:43.077 回答