Я имею:
class Service < ActiveRecord::Base
has_and_belongs_to_many :staffs
и
class Staff < ActiveRecord::Base
has_and_belongs_to_many :services
С промежуточной таблицей services_staffs со столбцами services_id и staffs_id
Следующий запрос успешно выполняется:
Staff.find( :all, :conditions => "service_id = #{service_id}" )
Но идя другие сбои направления:
Service.find( :all, :conditions => "staff_id = #{staff_id}" )
с
Рабочая нагрузка (0,3 мс) ВЫБИРАЕТ "сервисы".*, t0.staff_id как the_parent_record_id ОТ "сервисного" внутреннего объединения "services_staffs" t0 НА "сервисах" .id = t0.service_id, ГДЕ (t0.staff_id В (12,13,14)) Рабочая нагрузка SQLite3 (на 0,0 мс):: SQLException: никакой такой столбец: staff_id: ВЫБЕРИТЕ * ИЗ "сервисов" ГДЕ (staff_id = 13)
ActiveRecord:: StatementInvalid (SQLite3:: SQLException: никакой такой столбец: staff_id: ВЫБЕРИТЕ * ИЗ "сервисов" ГДЕ (staff_id = 13)):
Какая-либо идея, почему??
Обычно я использую has_many, а затем through, но концепция та же. Вам нужно включить ассоциацию в поиск, поэтому либо
Service.find( :all, :include => :staffs, :conditions => "staffs.id = #{staff_id}" )
Это сделает внешнее присоединение, поэтому включит все услуги и загрузит данные о персонале.
Service.find( :all, :joins => :staffs, :conditions => "staffs.id = #{staff_id}" )
Это сделает внутреннее присоединение и будет иметь только наборы данных по услугам (придется обратиться к базе данных, если вы вызовете service.staffs
для непрошеного совета, я рекомендую немного модифицировать ваш запрос.
Service.all(:include => :staffs, :conditions => ["staffs.id = ?", staff_id])
Массив экранирует вашу переменную staff_id
, чтобы помочь предотвратить атаки вредоносного кода.