Пользователь has_many :users, :through=› :friends — как?

Это мой код:

class Friend < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => "User", :foreign_key => "friend_id"
end

class User < ActiveRecord::Base
  #...
  has_many :friends
  has_many :users, :through => :friends
  #...
end

Теперь, когда я начинаю добавлять пользователей по...

user.users << user2
user.save

Заполняется только user_id друга, friend_id равен нулю.

Любая помощь?

Ваш, Джорн.


person Joern Akkermann    schedule 08.03.2010    source источник


Ответы (3)


Вам нужно добавить атрибут :source к вашей ассоциации has_many through.

class User < ActiveRecord::Base
 has_many :friends
 has_many :users, :source => :friend, :through => :friends
end

Теперь следующие вызовы будут работать.

u1.users << u2    
u.friends.last
# will print #<Friend id: 1, user_id: 1, friend_id: 4>

Примечания:

  1. Rails автоматически сохраняет ассоциации. Вам нужно вызывать save, только если модель пользователя новая.
  2. Вероятно, вам следует переименовать ассоциацию во что-то более явное. Например: friend_users и т. д.
person Harish Shetty    schedule 08.03.2010

Попробуйте: Railscasts — самореферентные ассоциации. Как правило, имеет очень хорошие учебники по всем перечисленным темам.

person Kevin Sylvestre    schedule 08.03.2010

Я думаю, вам нужно удалить own_to: user в вашей модели Friend.

person shingara    schedule 08.03.2010