Соблюдает ли acceptpts_nested_attributes_for условия в объявлении has_many? - PullRequest
0 голосов
/ 15 января 2011

При способе, которым я сейчас настроил свой код, пользователь has_many current_treatments (который отличается от других обработок тем, что ассоциация между ним и пользователем имеет логическое значение «current», установленное в true). Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь указать текущие обработки пользователя во вложенной форме через accepts_nested_attributes_for, «лечения» не сохраняются с «текущим» логическим набором.

Я предполагал, что acceptpts_nested_attributes_for выполняет эту работу за вас. Не так ли? Если да, что я делаю не так? Если этого не произойдет, каков наилучший способ достижения этого?

Вот мой пример:

 # user.rb
  has_many :treatings
  has_many :treatments, :through => :treatings
  has_many :current_treatments, :through => :treatings, :conditions => {'treatings.current' => true}, :source => :treatment

  accepts_nested_attributes_for :current_treatments

И я пытаюсь разрешить пользователю устанавливать свои текущие процедуры с помощью:

 # user/edit.html.erb
  <%= select_tag "user[current_treatment_ids][]", options_from_collection_for_select(Treatment.all, "id", "name", @user.current_treatment_ids), :multiple=>true %><br/>

Но при отправке формы я получаю что-то вроде:

 # development.log
  SQL (0.4ms)  INSERT INTO "treatings" ("created_at", "current", "treatment_id", "updated_at", "user_id") VALUES ('2011-01-15 18:49:02.141915', NULL, 4, '2011-01-15 18:49:02.141915', 1)

Обратите внимание, что новая обработка сохраняется без "текущего" логического значения со значением true, как указано в объявлении has_many.

РЕДАКТИРОВАТЬ : Вот модель Treatment.

class Treatment < ActiveRecord::Base

  has_many :treatings
  has_many :users, :through => :treatings
  has_many :current_users, :through => :treatings, :conditions => {:current => true}, :source => :user
  has_many :past_users, :through => :treatings, :conditions => {:current => false}, :source => :user

end

1 Ответ

1 голос
/ 16 января 2011

Ну, я сам обнаружил очевидную проблему:

# user/edit.html.erb 
<%= select_tag "user[current_treatment_ids][]", options_from_collection_for_select(Treatment.all, "id", "name", @user.current_treatment_ids), :multiple=>true %><br/>

Использование select_tag с идентификатором «user [current_treatment_ids] []» никогда не вызовет метод, сгенерированный методом acceptpts_nested_attributes. Идентификатор должен быть чем-то вроде «user [current_treatment_attributes] []».

Но тогда я думаю, что возникает вопрос о том, хочу ли я на самом деле accept_nested_attributes_for: current_treatment или вместо этого ASSOCIATION между: user и: current_treatment или так называемым: current_treating. Accepts_nested_attributes_for, как я понимаю, предназначен для создания новых объектов. Я не пытаюсь создать здесь новые методы лечения, просто новые методы лечения (или ассоциации между ними). ​​

Во всяком случае, немного поговорив со мной, но я собираюсь отметить это как решенное, поскольку мое желаемое направление этого вопроса уже не так остро, как я надеялся.

...