0

内部結合を使用して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があります。

4

2 に答える 2

1

あなたのクエリを読むと、「投稿のある製品があるすべてのサブカテゴリーを教えてください」と書かれています。.postson your |post|(実際にはサブカテゴリです)への呼び出しは、 collection を定義したことを示していますposts。したがって、SubCategory ごとに複数の投稿が必要です。

はコレクションなので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 が常にここで結合するとは限りません。いずれにせよ、製品と 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"
于 2013-09-14T19:08:47.670 に答える
0

.titleメソッドは個々の投稿ごとです。投稿の配列にタイトルの配列が必要な場合は、次のようにすることができます。

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

各投稿のタイトルだけが必要な場合は、次のようにします。

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