0

我需要使用内部连接加入三个表,我做了如下

@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。

4

2 回答 2

1

当我阅读您的查询时,它对我说“给我所有包含产品的子类别”。并且.posts对您的|post|(实际上是一个子类别)的调用表明您已经定义了一个集合posts。所以每个子类别必须有一个以上的帖子。

由于post.posts是一个集合,那么您可能需要对其进行迭代。

<% post.posts.each do |p| %>
  <h4><%= p.title %></h4>
<% end %>

看看代码会很有用sub_category.rb

另一个想法

如果您真的只想获得每个帖子,即使 sub_categories 和 products 重复,那么只需执行以下操作:

@posts = Post.includes(:product => :sub_category)

然后你总是会得到 Post 实例,你可以这样做

<% @posts.each do |post| %>
  <h4><%= post.title %></h4>
<% end %>

不过,Rails 可能并不总是在这里加入。无论哪种方式,它都会尝试一次性提取产品和子类别。

如果您只想发布没有其他字段的数据,但您想要一个联接。做这个:

@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"
于 2013-09-14T19:08:47.670 回答
0

.title方法适用于每个单独的帖子。如果您想要帖子数组的标题数组,您可以执行以下操作:

<%= post.posts.map(&:title) %>

如果您只是想要每个帖子的标题,您可以执行以下操作:

<%= post.title %>
于 2013-09-14T19:06:37.360 回答