Соединение Rails HABTM через две таблицы соединений - PullRequest
1 голос
/ 28 октября 2010

У меня есть следующие модели:

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

class FriendGroup < ActiveRecord::Base
  has_and_belongs_to_many :friendships
end

Как я могу объявить, что FriendGroup has_and_belongs_to_many :friends through :friendships?

Я хотел бы иметь FriendGroup.friend_ids, поэтому в форме я могу просто установитьполе 'friend_group[friend_ids][]' и просто позвоните FriendGroup.create(params[:friend_group]) без какой-либо дополнительной логики.

Ответы [ 3 ]

0 голосов
/ 28 октября 2010

Ну, я нашел не однострочное, а двухстрочное решение, которое выглядит достаточно элегантно:

class FriendGroup < ActiveRecord::Base
...
  attr_accessor :friend_ids
  before_create {|fg| fg.friendships = Friendship.find_all_by_user_id_and_friend_id(fg.user_id, fg.friend_ids)}
0 голосов
/ 28 октября 2010

Я запутался в том, что вы пытаетесь сделать с помощью FriendGroups.

Ваша базовая дружба смоделирована как:

class Friendship < ActiveRecord::Base
  belongs_to :user
  belongs_to :friend, :class_name => "User"
end

class User < ActiveRecord::Base
  has_many :friendships
  has_many :friends, :through => :friendships
end

Вы хотите массово создавать записи о дружбе между всеми пользователями, которых вы проходите? Это, наверное, какая-то проблема перестановок. Не то, для чего вам нужна другая модель. Может быть, метод класса на дружбе, как interconnect(user_ids).

Если вы хотите найти группы пользователей, которые все являются друзьями друг друга, похоже, что вы знакомы с теорией графов и связями.

EDIT:

В случае если FriendGroups были просто общими контейнерами друзей с прикрепленным именем, я бы сделал что-то вроде этого:

class User < ActiveRecord::Base
  has_many :friend_groupings
  has_many :friend_groups
  has_many :friendships
  has_many :friends, :through => :friendships
end

class FriendGrouping < ActiveRecord::Base
  belongs_to :friend_group
  belongs_to :friend
end

class FriendGroup < ActiveRecord::Base
  has_many :friend_groupings
  has_many :friends, :class_name => "User", :through => :friend_groupings
  belongs_to :user

  validates_presence_of :name # Name of FriendGroup
end

Я бы, вероятно, вложил FriendGroups в группу Users и имел бы FriendGroups accept_nested_attributes_for FriendGroupings. Я хотел бы сделать это в контроллере FriendGroup и в представлении FriendGroup разрешить пользователю устанавливать имя группы, а затем ставить ему флажки для каждого из своих друзей, чтобы поместить в группу. Для каждого друга, которого они выбирают, создайте новую FriendGrouping между FriendGroup и User. Это должно дать вам то, что вы хотите.

0 голосов
/ 28 октября 2010

класс FriendGroup : группы друзей конец

...