Привет,
У меня есть приложение, в котором 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?).
Приветствуются любые советы по наилучшему методу (предпочтительно, используя лучшие практики Rails 3)!