rails model doubts has_one,has_many,belongs_to

时间:2013-01-02 21:29:30

标签: ruby-on-rails-3 associations

我为小型系统创建了3个模型。这里的目的是处理用户,公司及其关系。我期望在交叉点上进行大量查找,并且还希望对可用的连接进行严格控制,因为用户只能属于一个公司,但公司可以拥有许多用户。我认为表达这个的最好方法是使用以下内容。我想对这个介词有一些反馈。到目前为止,我的测试已经很好地验证了我的论文,并且一些小的实现工作已经很顺利,但是当我查看用户列表以找到他们的公司时,我会遇到问题并且我感觉它与has_one关系有关,但不确定。再次感谢您提供建设性的反馈。

class User < ActiveRecord::Base
has_one  :companyrelationship, foreign_key: "user_id"
has_one  :company, :through => :companyrelationship, dependent: :destroy

class Company < ActiveRecord::Base
has_many :companyrelationships
has_many :users, :through => :companyrelationships

class CompanyRelationship < ActiveRecord::Base
belongs_to :company
belongs_to :user

validates :user_id, presence: true, uniqueness: true
validates :company_id, presence: true

1 个答案:

答案 0 :(得分:0)

我确实看到一件我非常确定是错误的东西并且不起作用。我也可以尝试添加几点建设性的批评。

错误是CamelCase模型名称转换为下划线(抱歉,我现在不记得那个术语)的情况。您对公司关系的所有引用都应添加下划线。您可以通过设置:class_name属性来覆盖约定,但我认为这不是您想要的。

我发现的另一个问题在技术上并不是错误,但几乎肯定不是你想要的,dependent: :destroy会在您删除Company时删除User。 (实际上,我不确定dependent: :destroy是否与through:关系有效。)我假设你想要的只是删除CompanyRelationship。您可以在此链接阅读 Dependent association 部分:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

下一点是默认foreign_key是型号+ _id,因此在这种情况下您无需指定它。

我的最后一点纯粹是一种风格偏好。我喜欢通过验证类型进行验证。你是通过变量来做的。它们在功能上是等同的,所以感觉要带上一粒盐。 (我非常确定useruser_id是等价的,但如果您对此感到满意,请随时坚持user_id。)

如果完全取决于我,我会这样编码:

class User < ActiveRecord::Base
  has_one  :company_relationship, dependent: :destroy
  has_one  :company, through: :company_relationship

class Company < ActiveRecord::Base
  has_many :company_relationships
  has_many :users, through: :company_relationships

class CompanyRelationship < ActiveRecord::Base
  belongs_to :company
  belongs_to :user

  validates_presence_of :user, :company
  validates_uniqueness_of :user

我希望这有助于你进一步发展。