2012-03-12 46 views
1

这可能是一个新手问题,但我似乎无法想到一个好的解决方案。我有一个company表,has_many users through groups也可以是公司的管理员(使他们能够编辑公司,但每个用户只有一家公司)。Rails“有时有一个”的关系

什么是最好的方式来设置这在Rails中?

我不能将admin字段添加到用户表中,因为它不会区分他/她正在管理哪个公司。但是,如果我做了一个company_id字段,那么这种关系在Rails中会是什么样子呢(因为它是一种关系!somtimes_has_one)。我可以离开它没有关系,但这似乎不正确...

在此先感谢您的帮助!

+0

是否每个公司有一个管理员用户? – Becuzz 2012-03-12 21:08:24

+0

是的,每个公司都有一个管理员用户,但它也有几个普通用户。那么,有没有办法做一个“has_one where”类型的关系? – Justin 2012-03-12 21:10:21

+0

在这种情况下,为什么不在公司表上放置一个AdminUserId字段来描述哪个用户是该公司的管理员? (我只是学习rails,所以我不确定神奇的rails语法是什么) – Becuzz 2012-03-12 21:14:07

回答

1

据我所知,你有一个可能属于一个公司的用户,如果有,它实际上可能会管理它。

你可以设置Group有例如,company_iduser_idadmin场(这样你知道哪些用户属于哪个公司,如果他们还管理该公司)

对于用户属于只有一个公司,你可以每两列(company_iduser_id

你可以通过做

class Company < ActiveRecord::Base 
    has_many :groups 
    has_many :users, through: :groups 
    has_many :administrators, through: :groups, source: :user, conditions: ["groups.admin = ?", true] 
end 
01弄一个公司的管理员添加一个验证的唯一性

,并呼吁所有用户company.administratorscompany.users

你也可以做类似

class User < ActiveRecord::Base 
    has_one :group 
    has_one :company, through: :group 
    has_one :administered_company, through: :group, source: :company, conditions: ["groups.admin = ?", true] 
end 

,所以你可以调用user.companyuser.administered_company

等等...

+0

完美,谢谢!不知道has_many关系中的'source'和能否使用'conditions'! – Justin 2012-03-13 02:37:07

+0

我刚刚有一个问题。尝试创建新公司时出现奇怪的SQL错误:“SQLite3 :: SQLException:no such column:users.group_id:SELECT 1 FROM”users“INNER JOIN”groups“ON”users“。”group_id “=”groups“。”id“WHERE”groups“。”company_id“IS NULL AND”users“。”id“= 1 AND(groups.admin ='t')LIMIT 1'。你知道为什么这是偶然抛出吗? – Justin 2012-03-13 21:15:18

+0

糟糕,没关系,这是因为我在使用CanCan,它正在寻找一些不存在的东西! – Justin 2012-03-13 21:16:37