Nested attributes i STI

Witam,

mam problem z zapisaniem modelu rodzica z zagnieżdżonym modelem “dziecka”. Validator twierdzi, że nie zna id rodzica, więc nie zapisywany jest ani rodzic, ani dziecko/dzieci.

#<ActiveModel::Errors:0x0000012b903950 @base=#<SerialNumber id: nil, snu: "s12", created_at: nil, updated_at: nil>, @messages={:"setup_items.serial_number_id"=>["nie może być puste"]}>

Próbowałem rozwiązań przedstawionych w zgłoszeniach do rails:
https://github.com/rails/rails/pull/3750
https://github.com/rails/rails/commit/42f1ad68655be08a0ff7e5a261d1ad21d3fc90a5

ale niestety nadal mam problem. Sprawdzałem też różne kombinacje has_one, has_many. Nested attributes bez STI działają poprawnie.

Może ktoś z Was ma jakiś pomysł jak rozwiązać problem?

Przykładowe modele:

[code]class Item < ActiveRecord::Base
belongs_to :serial_number

attr_accessor :item_type
attr_accessible :item_type, :description

def self.new(attributes = {}, options = {}, &block)
item_type = (attributes || {}).delete(:item_type)

if options && options[:as] == :administrator && item_type.present?
  item_class = "#{item_type.to_s.camelize}Item".constantize
  item_class.new(attributes, options, &block)
else
  super
end

end
end

class SetupItem < Item
end

class SerialNumber < ActiveRecord::Base
has_many :items
has_many :setup_items, class_name: “SetupItem”

accepts_nested_attributes_for :setup_items

attr_accessible :snu, :setup_items_attributes
end[/code]
Przykładowy kontroler:

[code]class SerialNumbersController < ApplicationController
def new
@serial_number = SerialNumber.new(snu: params[:serial_number][:snu], device_id: params[:serial_number][:device_id])
setup_item = @serial_number.setup_items.new({item_type: ‘Setup’}, as: :administrator)
end

def create
@serial_number = SerialNumber.new(params[:serial_number])
@serial_number.save!
end
end[/code]
Przykładowy widok:

[code]<%= form_for(@serial_number, validate: true, html: { class: “default-form” }) do |f| %>

<%= f.fields_for(:setup_items, validate: false) do |i| %>


<%= i.label :description, t(‘Description’) %>*

<%= i.text_area :description %>

<% end %>
<%= f.submit t('Save'), disable_with: t('Saving'), class: 'save_button' %>
<%= f.hidden_field(:snu, value: @serial_number.snu ) %>
<% end %>[/code]

Nie widzę żadnych walidatorów w tym kodzie

@paneq: Faktycznie, nie wkleiłem jednej linijki z walidatorem (pierwszy kod poniżej).

W modelu SetupItem miałem źle ustawiony walidator:

validates :serial_number_id, presence: true

Pomogło usunięcie powyższego walidatora i dodanie w modelu SerialNumber:

validates_associated :setup_items