0

Post複数の投稿にリンクまたはリンクできるクラスを定義します。これを行うために、とを指定するクラスを追加しましPostLinkた。post_topost_from

もちろん、PostLinkによってクラスを生成し、追加しましたrails g model post_link from_post:integer to_post:integerrake db:migrate

belongs_to :from_post, :class_name => 'Post' 
belongs_to :to_post, :class_name => 'Post'

クラスに。

has_many :post_linksそして、私もPostクラスにいます。

私は走っrails consoleて印刷されましたが、これは予想通りですPost.new.post_linksnilただし、Post使用を保存した後

p = Post.new
p.save

次に実行するp.post_linksと、次のエラーメッセージが出力されます。

SQLite3::SQLException: no such column: post_links.post_id: SELECT "post_links".* 
FROM "post_links"  WHERE "post_links"."post_id" = 1

それで、データベースに保存した後、post_linkアクセスできない理由を誰かが知っていますか?

4

1 に答える 1

1

post_linksの外部キーがデフォルトであると想定しているため、のhas_many :post_links関連付けはエラーをスローします。とを使用しているため、「from」投稿と「to」投稿のpost_linksをグループ化して、投稿のpost_linksの合計セットを取得する方法を見つける必要があります。Postpost_idfrom_post_idto_post_id

1つのアプローチは、2つの関連付けを定義しPost、セットを一緒に追加するための追加のメソッドを定義することです。

class Post < ActiveRecord::Base

  has_many :from_post_links, :class_name => 'PostLink', :foreign_key => :from_post_id
  has_many :to_post_links, :class_name => 'PostLink', :foreign_key => :to_post_id'

  def post_links
    from_post_links + to_post_links
  end

end

別のオプションとして、アソシエーションに特別なSQLを提供して、単一のクエリでセットをグループ化することができます。

class Post < ActiveRecord::Base

  has_many :post_links, :finder_sql => Proc.new {
    %Q{
      SELECT *
      FROM post_links pl
      WHERE pl.to_post_id = #{id} 
      OR pl.from_post_id = #{id}
    }
  }
于 2012-10-14T03:37:24.240 に答える