has_and_belongs_to_many запрашивают работы в одном направлении, сбои в другом

Я имею:

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)):

Какая-либо идея, почему??

1
задан 99miles 2 July 2010 в 18:16
поделиться

1 ответ

Обычно я использую 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, чтобы помочь предотвратить атаки вредоносного кода.

2
ответ дан 2 September 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: