【问题标题】:Rails -- whats the proper relationship modelRails - 什么是正确的关系模型
【发布时间】:2011-10-02 02:22:56
【问题描述】:

我有一个为学校构建的 Rails 应用程序。系统中的用户是跟踪孩子活动的父母(也称为家庭成员或只是成员)。教师也是用户,可以登录参与活动。 Member 模型是应用程序用来查找参与者的地方。这样可以找到教师,他们被添加到成员模型中,出于同样的原因,父母也被添加。

添加到此应用程序的教师将在每个表 user、user_member 和 member 中有一条记录。 user 中的一条记录允许他登录,member 中的 1 条记录以便他可以搜索,user_member 中的 1 条用于建立关联。在这种情况下,查找用户自己的成员记录是微不足道的。但是,如果我是一个有登录名和系统中有 2 个孩子(James 和 Brian)的父母,其中一个人会在 Members 表中找到 3 条记录,一条给 James,一条给 Brian,一条给我自己。我需要知道哪个成员记录是我的,而不是 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

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

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

    【讨论】:

    • 回调的好技巧。我确实有一个关于从成员方面设置关联的问题。尝试在控制台 &gt; me_as_member.user=me_as_user 中执行以下操作以设置成员的 user_id 失败。我得到 NoMethodError: undefined method `const_defined?'对于#。我做错了什么?
    • 在使用祖先 gem 时,我在范围内使用了似乎是保留字“父级”的内容。更改范围名称解决了问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多