ご挨拶、
メンバーシップに関する追加情報(具体的には、ユーザーが会社の管理者であるかどうか、ブール値を介して)を含むモデルを介して相互に属する必要があるアプリケーションがCompanies
あります。コードの単純なバージョン:Users
CompanyMembership
admin
class CompanyMembership < ActiveRecord::Base
belongs_to :company
belongs_to :user
end
class Company < ActiveRecord::Base
has_many :company_memberships
has_many :users, :through => :company_memberships
end
class User < ActiveRecord::Base
has_many :company_memberships
has_many :companies, :through => :company_memberships
end
もちろん、これにより、などを介して会社のすべてのメンバーを簡単に取得できますcompany.users.all
。ただし、その会社の管理者である会社のすべてのユーザーのリストを取得しようとしています(また、ユーザーが特定の会社の管理者であるかどうかをテストしようとしています)。私の最初の解決策は次のとおりでしたcompany.rb
:
def admins
company_memberships.where(:admin => true).collect do |membership|
membership.user
end
end
def is_admin?(user)
admins.include? user
end
これは機能しますが、何かが非効率に感じられ(各メンバーシップを反復処理し、毎回SQLを実行しますか?それともRelationはそれよりも賢いですか?)、これを実行するためのより良い方法があるかどうかはわかりません(おそらくRails 3が使用するスコープまたは派手な新しいRelation
オブジェクト?)
続行するための最良の方法(できればRails 3のベストプラクティスを使用する)に関するアドバイスをいただければ幸いです。