我为小型系统创建了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
答案 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
,因此在这种情况下您无需指定它。
我的最后一点纯粹是一种风格偏好。我喜欢通过验证类型进行验证。你是通过变量来做的。它们在功能上是等同的,所以感觉要带上一粒盐。 (我非常确定user
和user_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
我希望这有助于你进一步发展。