0

我定义了一个Post可以链接或链接到多个帖子的类。为此,我添加了一个PostLink指定post_toand的类post_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_linksnilPost

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

中的has_many :post_links关联会Post引发错误,因为它假定 post_links 中的外键是post_id默认的。由于您使用from_post_idand to_post_id,因此您必须找到一种方法来对“发件人”帖子和“发件人”帖子的 post_links 进行分组,以获得帖子的总 post_links 集。

一种方法可能是定义两个关联,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 回答