2

我想(作为一个例子)has_many为一个人的朋友的所有帖子创建一个关联,比如has_many :remote_posts给我一些类似person > friends > person > posts.

..这就是我将如何去做

script/generate model post title:string person_id:integer
script/generate model friendship person_id:integer friend_id:integer
script/generate model person name:string

class Person < ActiveRecord::Base
  has_many :posts
  has_many :friendships, :foreign_key => 'friend_id'
  has_many :people, :through => :friendships
  has_many :remote_posts, :class_name => 'Post', :through => :people, :source => :posts
end
class Friendship < ActiveRecord::Base
  belongs_to :person
  #also has a 'friend_id' to see who the friendship is aimed at
end
class Post < ActiveRecord::Base
  belongs_to :person
end

# generate some people and friends
{'frank' => ['bob','phil'], 'bob' => ['phil']}.each {|k,v|
  v.each {|f| 
    Friendship.create(
      :person_id => Person.find_or_create_by_name(f).id,
      :friend_id => Person.find_or_create_by_name(k).id
    )
  }
}
# generate some posts
Person.all.each {|p|
  p.posts.create({:title => "Post by #{p.name}"})
}

现在,

Person.first.friendships  # ..works
Person.first.people  # (friends) ..works
Person.first.posts # ..works
Person.first.remote_posts #....

...我得到这个错误..

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: people.person_id: SELECT "posts".* FROM "posts" INNER JOIN "people" ON "posts".person_id = "people".id WHERE (("people".person_id = 1))

除了外键错误 - 似乎友谊协会根本没有发挥作用。我在想这可能是因为:source => :posts, 因为posts协会会加入它两次。

我可以写一些finder sql(这就是我目前正在工作的),尽管我更愿意这样做。

关于如何让它发挥作用的任何想法?

4

2 回答 2

1

这个怎么样:

FriendShip类中,添加:

has_many :posts, :through => :person


并在Person课堂上,将 remote_posts 更改为:

has_many :remote_posts, :class_name => 'Post',
         :through => :friendships, :source => :person
于 2009-10-20T15:57:50.640 回答
0

has_many :through嵌套关系怎么样。这似乎对我有用:

class Friendship < ActiveRecord::Base
  belongs_to :person
  belongs_to :friend, :class_name => 'Person'
  has_many :posts, :through => :friend, :source => :posts
end
class Person < ActiveRecord::Base
  has_many :posts
  has_many :friendships, :foreign_key => 'friend_id'
  has_many :people, :through => :friendships
  has_many :remote_posts, :through => :friendships, :source => :posts
end

注意:这需要这个nested_has_many_through插件。(注意:直接链接到 github repos 似乎被破坏了......但是尽管有错误消息,但那个 repo 仍然存在。)

于 2009-11-30T21:35:09.503 回答