Rails - 什么是正确的关系模型

时间:2011-07-10 02:27:19

标签: ruby-on-rails activerecord

我有一个专为学校设计的rails应用程序。系统中的用户是跟踪孩子活动的父母(也称为家庭成员或仅仅是成员)。教师也是用户,可以登录参加活动。成员模型是应用程序用于查找参与者的位置。因此,可以发现教师被添加到成员模型中,出于同样的原因,也添加了父母。

添加到此应用程序的教师在每个表user,user_member和member中都有一条记录。用户允许登录的记录,成员中的1条记录,以便可以搜索,并在user_member中进行1次关联。在这种情况下,查找用户自己的成员记录是微不足道的。但如果我是系统中有登录和2个孩子的父母,James和Brian,会在会员表中找到3条记录,一条用于James,一条用于Brian,一条用于我自己。我需要知道哪个会员记录是我的,而不是詹姆斯或布莱恩。

对此进行建模的最佳方法是什么?我考虑了两个选项1)用户表中有一个指向用户自己的member_id的外键或者2)user_members表有一个名为'own_member'的布尔值,表示这个user_id的member_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 :(得分:0)

听起来像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