class People
belongs_to :client
has_many :store_roles
end
class Roles
has_many :store_roles
end
class StoreRole
belongs_to :role
belongs_to :people
belongs_to :store
end
class Client
has_many :stores
has_many :people
end
class Store
belongs_to :client
has_many :store_roles
has_many :roles, :through => :store_roles
end
Предположим, что все эти классы наследуются от ActiveRecord::Base
;)
Вам потребуется настроить миграцию и структуру базы данных, чтобы отразить эти отношения.Для каждого belongs_to
есть поле :object_id
в таблице, ссылающееся на соответствующий идентификатор таблицы.
Ваш запрос должен выглядеть примерно так:
Store.find(1).roles.find(:all, :conditions => ["store_roles.person_id = ?", 1])
Я бы, наверное,добавьте метод в модель магазина, чтобы сделать это немного проще:
def roles_for(person_id)
roles.find(:all, :conditions => ["store_roles.person_id = ?", person_id])
end
Таким образом, вы можете найти роли, используя:
Store.find(1).roles_for(1)
Или, еще лучше:
def self.roles_for(store_id, person_id)
Role.find(:all, :joins => :store_roles, :conditions => ["store_roles.store_id = ? AND store_roles.person_id = ?", store_id, person_id])
end
Что меняет наш искатель на:
Store.roles_for(1, 1)
Я бы сказал, что этот последний метод является наиболее идеальным, поскольку он вызывает только один запрос, в то время как каждый из других параметров выполняет два запроса кпросмотр базы данных по ролям (один для поиска магазина и один для получения ролей для person_id).Конечно, если у вас уже есть экземпляр объекта Store, это не имеет большого значения.
Надеюсь, этого ответа было достаточно:)