запрос has_and_belongs_to_many работает в одном направлении, в другом - неудачно - PullRequest
1 голос
/ 02 июля 2010

У меня есть:

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 мс) ВЫБЕРИТЕ "services". *, T0.staff_id как the_parent_record_id FROM "services"ВНУТРЕННЕЕ СОЕДИНЕНИЕ "services_staffs" t0 ON "services" .id = t0.service_id WHERE (t0.staff_id IN (12,13,14)) Сервисная нагрузка (0,0 мс) SQLite3 :: SQLException: нет такого столбца: staff_id: SELECT * FROM"services" WHERE (staff_id = 13)

ActiveRecord :: StatementInvalid (SQLite3 :: SQLException: такого столбца нет: SELECT * FROM "services" WHERE (staff_id = 13)):

Любая идея, почему ??

1 Ответ

2 голосов
/ 02 июля 2010

Я обычно использую has_many и затем через, но концепция та же. Вам нужно включить ассоциацию в поиск, чтобы либо

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

...