Как я могу создать новые записи с помощью has_many: through и honor: условий? - PullRequest
9 голосов
/ 04 октября 2009

Допустим, у меня есть курс, в который студенты могут записаться через членство (например, has_and_belongs_to_many Relationsip курсов и студентов). Некоторые членства предназначены для учеников, которые только наблюдают за классом (не за кредит и т. Д.), Поэтому:

class Course < ActiveRecord::Base
  has_many :memberships

  has_many :students,
           :through => :memberships

  has_many :observers,
           :through => :memberships,
           :source => :student,
           :conditions => { :memberships => { :observer => true }}
end

Вот что прекрасно работает:

observers = Course.find(37).observers

Вот что не работает:

new_observer = Course.find(37).observers.build(:name => 'Joe Student')

Я бы подумал, что можно создать новые записи, используя ассоциацию, и это сгенерировало бы:

  1. Новая студенческая запись («Джо Студент»)
  2. Новая запись о членстве (course_id = 37, student_id = (joe), наблюдатель = true)

Но вместо этого я получаю:

ActiveRecord::AssociationTypeMismatch: Membership expected, got Array

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

Большое спасибо за любую возможную помощь!

1 Ответ

6 голосов
/ 04 октября 2009

Я полагаю, что вы столкнулись с ошибкой Rails. Я попытался сделать то же самое на своем боксе (2.3.4), и он выдает мне ту же ошибку, которая кажется не совсем правильной. Кроме того, я также попытался обойти:

course = Course.first
course.observers << Student.create(:name => "Joe Student")
course.save

Но это создает членство с полем наблюдателя, установленным в false !

Последний уродливый обходной путь, с которым я столкнулся, - это создание записи Membership вручную:

Membership.create!(:course => Course.first, :student => Student.first, :observer => true)

Я создал билет для этого , и я буду продолжать расследование после завтрака.

РЕДАКТИРОВАТЬ : Я, как и обещал, провел дальнейшее расследование и обнаружил, изменили ли вы свой :conditions хэш на массив, такой как:

:conditions => ["memberships.observer = ?", true]

Работает как задумано. У меня также есть репозиторий github с примером кода и инструкциями для дублирования.

...