2012-03-12 12 views
1

これは恐らく初心者の質問ですが、良い解決策は考えられません。私はcompanyのテーブルhas_many users through groupsを持っており、会社の管理者(会社を編集できるようにするが、ユーザーごとに1社のみ)を管理することもできます。Rails "Sometimes Has One" Relationships

これをRailsで設定するにはどうすればよいですか?

ユーザーテーブルにadminフィールドを追加することはできません。なぜなら、管理している会社を区別しないからです。しかし、私がcompany_idフィールドを実行すると、その関係はRailsのように見えます(これは一種のsomtimes_has_oneなので)!私は関係なくそれを残すことができるが、それは適切と思われません...

事前にお手伝いを!

+0

は、すべての企業をい管理者がいますか? – Becuzz

+0

はい、すべての会社に管理ユーザーがいますが、通常のユーザーも複数います。ですから、 "has_one where"型の関係を行う方法はありますか? – Justin

+0

その場合、そのユーザーの会社の管理者を説明するAdminUserIdフィールドを企業テーブルに配置してみませんか? (私は柵を学んでいますので、魔法の柵の文法がどうなるかはわかりません) – Becuzz

答えて

1

私が理解しているところから、会社に所属している可能性のあるユーザーがいれば、それが実際に管理するかもしれません。

セットアップGroupは、例えばcompany_iduser_idadminフィールド持っている可能性があり(あなたが属しているユーザーを知ることを得るこの方法をするためにどの会社、と彼らはまた、その会社管理する場合)へのユーザーのために

をあなたは

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を実行して、一つの会社の管理者を得ることができ

ただ一つの会社が2つの列(company_iduser_id)あたりの一意性の検証を追加することができますに属し

とすべてのユーザーのcompany.administratorsまたはcompany.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.companyまたはuser.administered_company

のように...

+0

パーフェクト、ありがとう!関係を使ってhas_manyで 'ソース'と '条件'を使う能力について知りませんでした! – Justin

+0

私はちょうど1つの質問がありました。 SQLite3 :: SQLException:いいえその列:users.group_id:SELECT 1 FROM "ユーザー" INNER JOIN "グループ" ON "ユーザー"。 "group_id "id" = "AND"(groups.admin = 't')LIMIT 1 '。なぜこれが偶然に投げ込まれているのか知っていますか? – Justin

+0

私はCanCanを使用しており、存在しないものを探しているので、気にしないでください! – Justin