4

結合モデル UsersOrganisation を持つユーザーと組織があります。ユーザーは組織の管理者である可能性があります。その場合、is_admin ブール値は true です。

データベースに手動で is_admin ブール値を設定すると、Organisations.admins は期待どおりに機能します。

コンソールで実行するOrganisation.first.users << User.firstと、思ったとおり、organisations_users エントリが作成されます。

ただし、これを行うOrganisation.first.admins << User.lastと、管理者ではなく通常のユーザーが作成されます。つまり、結合テーブルの is_admin ブール値が正しく設定されていません。

結合テーブルに直接エントリを作成する以外に、これを行う良い方法はありますか?

class User < ActiveRecord::Base

  has_many :organisations_users
  has_many :organisations, :through => :organisations_users

end

class Organisation <  ActiveRecord::Base

  has_many :organisations_users
  has_many :users, :through => :organisations_users
  has_many :admins, :through => :organisations_users, :class_name => "User", 
            :source => :user, 
            :conditions => {:organisations_users => {:is_admin => true}}

end

class OrganisationsUser < ActiveRecord::Base

  belongs_to :organisation
  belongs_to :user

end
4

3 に答える 3

5

関連の << メソッドはいつでもオーバーライドできます。

has_many :admins do

  def <<(user)
    user.is_admin = true
    self << user
  end

end

(コードはチェックしていません)

于 2012-08-28T12:34:44.657 に答える
2

has_many :throughと演算子にはいくつかのねじれがあり<<ます。しかし、@Erezの回答のようにオーバーロードすることができます。

これに対する私のアプローチは、スコープを使用することです(OrganisationsUsersの名前をMembershipsに変更しました)。

class User < ActiveRecord::Base

  has_many :memberships
  has_many :organisations, :through => :memberships

end

class Organisation <  ActiveRecord::Base
  has_many :memberships
  has_many :members, :through => :memberships, :class_name => 'User', :source => :user

  # response to comment:
  def admins 
    memberships.admin
  end
end

class Memberships < ActiveRecord::Base

  belongs_to :organisation
  belongs_to :user

  scope :admin, where(:is_admin => true)
end

今、私はこのような新しい管理者を作成します:

Organisation.first.memberships.admin.create(:user => User.first)

スコープについて私が気に入っているのは、メンバーシップクラスで「メンバーシップの種類」を定義することです。組織自体は、メンバーシップの種類をまったく気にする必要がありません。

更新

今、あなたはすることができます

Organisation.first.admins.create(:user => User.first)

于 2012-08-28T12:42:10.577 に答える
1

以下の組織モデルのコードを試すことができます。

class Organisation < ActiveRecord::Base

  has_many :organisations_users
  has_many :organisations_admins, :class_name => "OrganisationsUser", :conditions => { :is_admin => true }

  has_many :users,  :through => :organisations_users
  has_many :admins, :through => :organisations_admins, :source => :user

end
于 2012-08-28T12:33:10.797 に答える