我需要使用内部联接连接三个表,我按照以下方式执行
@posts = SubCategory.joins(products: :posts)
现在我正在尝试列出posts
表的字段,但它正在抛出错误
undefined method `title' for #<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Post:0x9932f84>
我尝试了类似这样的东西,但我的观点却没有帮助
<% @posts.each do |post| %>
<h4><%= post.posts.title %></h4>
<% end %>
任何建议
修改1
ActiveRecord::StatementInvalid in Posts#index
PG::UndefinedColumn: ERROR: column posts.sub_category_id does not exist
LINE 1: SELECT "posts".* FROM "posts" WHERE "posts"."sub_category_i...
我的帖子表中没有sub_category_id。但是我的帖子表中有product_id。
答案 0 :(得分:1)
当我阅读您的查询时,它会告诉我“给我所有带有帖子的产品的子类别。在.posts
(实际上是子类别)上调用|post|
表示您已定义了集合posts
。因此每个SubCategory必须有多个帖子。
由于post.posts
是一个集合,因此您可能需要迭代它。
<% post.posts.each do |p| %>
<h4><%= p.title %></h4>
<% end %>
查看sub_category.rb
另一个想法
如果你真的只想获得每个帖子,即使sub_categories和产品被重复,那么就这样做:
@posts = Post.includes(:product => :sub_category)
然后你总是得到Post实例,你可以这样做
<% @posts.each do |post| %>
<h4><%= post.title %></h4>
<% end %>
但是Rails可能并不总是在这里加入。无论哪种方式,它都试图一次性拉出product和sub_category。
如果您只想要发布没有其他字段的数据,但您想要加入。这样做:
@posts = Post.joins(:product => :sub_category)
这应该产生一个如下所示的查询:
SELECT "posts".* FROM "posts"
INNER JOIN "products" ON "products"."id" = "posts"."product_id"
INNER JOIN "sub_categories" ON "sub_categories"."id" = "products"."sub_category_id"
答案 1 :(得分:0)
.title
方法适用于每个帖子。如果您想要一系列帖子的标题,您可以执行以下操作:
<%= post.posts.map(&:title) %>
如果你只是想要每个帖子的标题,你可以这样做:
<%= post.title %>