2

私は次のモデルを持っています:

class SocUser < ActiveRecord::Base
  attr_accessible :email, :id, :name, :username
  has_many :friends, :class_name => 'SocFriend', :foreign_key => 'user_id', :dependent =>  :destroy
  has_many :ownlist, :class_name => 'SocOwnlist', :foreign_key => 'user_id', :dependent =>  :destroy
end

class SocFriend < ActiveRecord::Base
  attr_accessible :user_id, :friend_id
  belongs_to :user, :class_name => 'SocUser'
  belongs_to :friend, :class_name => 'SocUser'
end

class SocOwnlist < ActiveRecord::Base
  attr_accessible :user_id, :book_id
  belongs_to :user, :class_name => 'SocUser'
  belongs_to :book, :class_name => 'SocBook'
end

ユーザーは多くの友達を持つことができます。そして、それぞれの友達もユーザーです。どのユーザーも多くの本を持つことができます。ユーザーが友人のすべての本にアクセスできるように関連付けを追加するにはどうすればよいですか。

SocUser に関連付けを追加するとhas_many :avail_list, :class_name => 'SocOwnlist', :through => :friends, :source => :friend

呼び出し時に生成される sql クエリmyuser.avail_listは次のとおりです。

SELECT "soc_ownlists".* FROM "soc_ownlists" INNER JOIN "soc_friends" ON "soc_ownlists"."id" = "soc_friends"."friend_id" WHERE "soc_friends"."user_id" = 1

ただし、ON 条件は「soc_ownlists」である必要があります。"user_id" = "soc_friends"."friend_id" ですが、指定する方法はありますか?

または、関連付けを指定する他の方法はありますか?

4

1 に答える 1

0

関連付けの primary_key を設定する必要があります

has_many :avail_list, :class_name => 'SocOwnlist', :through => :friends, :source => :friend, :primary_key => 'user_id'
于 2013-02-16T20:31:32.447 に答える