Rails 求教,星型结构 through 关联问题

everett · 2013年04月09日 · 最后由 everett 回复于 2013年04月09日 · 2341 次阅读
class Member < User
 has_one :account
 has_one :branch, :through => :account
 has_one :company, :through => :account
end

class Account  < ActiveRecord::Base
 belongs_to :Member
 belongs_to :company
 belongs_to :branch
end

class Branch  < ActiveRecord::Base
 has_many :accounts
 has_many :members, :through => :accounts
end

class Company  < ActiveRecord::Base
 has_many :accounts
 has_many :members, :through => :accounts
end 

我试图在多多关联中,在 through 表中同时保存两个对象关联。上述代码的查询功能没问题。 但是如果是这样做:

@member = @company.members.create
@branch.members << @member

第二句就会重新创建一个新的 account 对象出来,Account 表看起来是这样的。 Account Table

| id | member_id | company_id | branch_id | | 1 | 1 | 1 | null | | 2 | 1 | null | 1 |

有意思的是,在这个时候如果,使用

@branch = @member.branch
or
@company = @member.company

依然可以得到正确结果。

我 google 了半天,没有找到有用的资料。请问谁知道关于这个问题的解释?谢谢

我去,真能设计。Company 当成字典表,belong_to member, Account 也 belong_to member 就可以了。

@xds2000 :-),原谅我的小纠结,这个问题发生在最近的一次重构中,把一些平时没有时间验证的想法拿出来琢磨琢磨。我很好奇,有没有这种设计可能。 你的意思是把 Company 做成枚举?不行啊,这是一个多公司的系统。

Company 和 members 不是一对一的关系吗?你直接 belong_to member 不就可以了。

Account 和 Member 是一个东西,你又嵌套一层。Account 不就是多一个 branch 吗?你再想想。

@xds2000 是一对多的关系。 系统有很多公司 公司 has_many 分公司 分公司 has_many 员工 考虑到新进员工可能存在尚未分配分公司的问题 所以员工和公司之间需要有一个关联

当然这个问题如果在 controller 里面直接对 accout 进行操作会很容易。 我通过 overide“def advisors<<(advisor)”也能实现。 但是,我还是想知道一下。有没有更直接的方式。

@xds2000 这个嵌套的理由是由于 devise 系统除了公司员工还有其他的用户类别 在原系统中,我把每一个用户类别都做一个独立的 devise 对象。 在新的重构中,我尝试将所有有登录权限的用户都用 STI 继承出来。把不同用户独有的属性剥离到了 account 对象中。 也就是说 advisor 有 advisor_accout,member 有 member_account

需要 登录 后方可回复, 如果你还没有账号请 注册新账号