Has_many, через ассоциацию - PullRequest
1 голос
/ 23 марта 2011

Предупреждение: Total Rails Newb (TRN). Это должен быть довольно простой вопрос, поэтому я надеюсь, что кто-то может сэкономить пару минут, чтобы помочь пролить свет.

Допустим, у меня есть следующие модели: пользователь, группа и участник У пользователя может быть много групп (скажем, друзей, семьи и т. Д.) В группе может быть много участников, а именно других пользователей.

Как бы я это структурировал?

Сначала я попробовал это:

class User < ActiveRecord::Base
  has_many :groups
  has_many :groups, :through => :members
end

class Groups < ActiveRecord::Base
  has_many :users, :through => :members
  belongs_to :user
end

class Member < ActiveRecord::Base
  belongs_to :group
  belongs_to :user
end

Однако, это дало мне ошибку в User, поэтому я изменил

has_many :groups, :through => :members

до

has_many :memberships, :through => :members, :source => :groups

По-прежнему появляется ошибка об отсутствии связи, когда я пытаюсь сделать

group = Group.new
group.user.new

Ответы [ 3 ]

6 голосов
/ 23 марта 2011

Будет полезно: http://railscasts.com/episodes/47-two-many-to-many

class User < ActiveRecord::Base
  has_many :members
  has_many :groups, :through => :members
  has_many :groups_as_owner, :class_name => "Group"
end

class Groups < ActiveRecord::Base
  has_many :members
  has_many :users, :through => :members
  belongs_to :owner, :class_name => "User", :foreign_key => :user_id
end

class Member < ActiveRecord::Base
  belongs_to :group
  belongs_to :user
end
2 голосов
/ 23 марта 2011

в основном сквозные ассоциации has_many - это n: m ассоциаций (таблиц соединений), которые (должны) иметь больше атрибутов, чем просто идентификаторы идентификаторов объединенной записи ...

поэтому у вас есть таблица Groups (с идентификатором), таблица Users (с идентификатором) и таблица Members (без идентификатора, но user_id и group_id)

в принципе, то, что вы сделали, почти правильно, просто подумайте, как вы получаете доступ к группе от пользователя или наоборот ....

пользователь сначала просматривает информацию о своем члене и через эту информацию о члене получает доступ к информации о группе ... и наоборот для группы

так что вы сначала настроили

has_many :members

, а затем позвоните

has_many :groups, :through => :members

все что вам нужно это

class User < ActiveRecord::Base
  has_many :members
  has_many :groups, :through => :members
end

class Groups < ActiveRecord::Base
  has_many :members
  has_many :users, :through => :members
end

class Member < ActiveRecord::Base
  belongs_to :group
  belongs_to :user
end

и у вас есть еще одна ошибка в вашем коде выше

вы можете использовать

user = group.users.new

вместо

user = group.user.new
1 голос
/ 23 марта 2011

Попробуйте эту структуру:

class User < ActiveRecord::Base
  has_many :members
  has_many :groups, :through => :members
end

class Groups < ActiveRecord::Base
  has_many :members
  has_many :users, :through => :members
end

class Member < ActiveRecord::Base
  belongs_to :group
  belongs_to :user
end

Также посмотрите на has_and_belongs_to_many, если вам не нужно делать с классом Member, вы должны использовать has_and_belongs_to_many. В этом случае не забудьте создать таблицу соединений в базе данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...