Rails - какая модель отношений - PullRequest
0 голосов
/ 10 июля 2011

У меня есть приложение, предназначенное для школ.Пользователи в системе - это родители, которые отслеживают действия своих детей (члены семьи или просто члены).Учителя также являются пользователями и могут войти в систему для участия в мероприятиях.Модель Member - это место, которое приложение использует для поиска участников.Чтобы найти учителей, они добавляются в модель Member и по той же причине добавляются и родители.

Учитель, добавленный в это приложение, будет иметь одну запись в каждой таблице user, user_member и member.Запись в пользователе, позволяющая ему войти, 1 запись в члене, чтобы он мог быть доступен для поиска, и 1 в user_member для установления связи.В этом случае поиск собственной записи пользователя является тривиальным.Но если бы я был родителем с логином и двумя детьми в системе, Джеймсом и Брайаном, можно было бы найти 3 записи в таблице «Члены», одну для Джеймса, одну для Брайана и одну для себя.Мне нужно знать, какая запись участника моя, а не Джеймса или Брайана.

Какой лучший способ смоделировать это?Я рассмотрел два варианта: 1) в пользовательской таблице есть внешний ключ, который указывает на собственный member_id пользователя. ИЛИ 2) таблица user_members имеет логическое значение «own_member», которое указывает, что member_id этого user_id является записью участника для пользователя.Есть ли один, который будет предпочтительнее?Еще один рельс как?И как бы я сделал вызов построить / создать ассоциации?

Текущие отношения моделируются так:

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

class UserMember < ActiveRecord::Base
  belongs_to :user
  belongs_to :member
end

class Member < ActiveRecord::Base
  has_many :user_members
  has_many :user, :through => :user_members  
end

1 Ответ

0 голосов
/ 10 июля 2011

Похоже, что модель соединения UserMember описывает, к каким членам пользователь имеет права доступа.Это другая концепция, чем отслеживание того, какая запись члена связана с конкретным пользователем.Похоже, что у пользователя будет запись участника, а член будет принадлежать пользователю, что подразумевает следующую структуру базы данных:

class User < ActiveRecord::Base
  has_many :user_members
  has_many :members, :through => :user_members
  has_one :member
end

class UserMember < ActiveRecord::Base
  belongs_to :user
  belongs_to :member
end

class Member < ActiveRecord::Base
  has_many :user_members
  has_many :user, :through => :user_members 
  belongs_to :user 
end

Это означает добавление еще одного столбца базы данных в таблицу участников для "user_id".Создание и построение записи члена из экземпляра User может быть сделано следующим образом:

user = User.new
user.build_member
user.create_member

Дополнительная информация о построении через ассоциации здесь: http://ar.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

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

# app/models/user.rb
class User < ActiveRecord::Base
  before_create :build_member

  def build_member
    self.build_member
  end
end

Более подробная информация об обратных вызовах здесь: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

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