如何在视图中显示联接结果

时间:2013-09-14 18:45:26

标签: ruby-on-rails ruby-on-rails-3

我需要使用内部联接连接三个表,我按照以下方式执行

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

2 个答案:

答案 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 %>