Привет,
У меня есть приложение, в котором 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
, et al. Однако я пытаюсь получить список всех пользователей в компании, которые являются администраторами этой компании (а также проверить, является ли пользователь администратором данной компании). Моим первым решением было следующее в 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 умнее этого?), И я не уверен, есть ли лучший способ сделать это (возможно, используя области или новые фантастические Relation
объекты, которые использует Rails 3?).
Будем весьма благодарны за любые советы о том, как лучше действовать (желательно с использованием лучших практик Rails 3)!