Я использую Rails 3.0.6 с mongoID 2.0.2.Недавно я столкнулся с проблемой сохранения!метод при переопределении сеттера (я пытаюсь создать свои собственные вложенные атрибуты).
Итак, вот модель:
class FeedItem
include Mongoid::Document
has_many :audio_refs
def audio_refs=(attributes_array, binding)
attributes_array.each do |attributes|
if attributes[:audio_track][:id]
self.audio_refs.build(:audio_track => AudioTrack.find(attributes[:audio_track][:id]))
elsif attributes[:audio_track][:file]
self.audio_refs.build(:audio_track => AudioTrack.new(:user_id => attributes[:audio_track][:user_id], :file => attributes[:audio_track][:file]))
end
end
if !binding
self.save!
end
end
Модель AudioRef (которая является просто буфером между audio_tracks и feed_items):
class AudioRef
include Mongoid::Document
belongs_to :feed_item
belongs_to :audio_track
end
И AudioTrack:
class AudioTrack
include Mongoid::Document
has_many :audio_refs
mount_uploader :file, AudioUploader
end
Итак, вот спецификация для модели FeedItem, которая не работает:
it "Should create audio_track and add audio_ref" do
@audio_track = Fabricate(:audio_track, :user_id => @author.id, :file => File.open("#{Rails.root}/spec/stuff/test.mp3"))
@feed_item= FeedItem.new(
:user => @author,
:message => {:body => Faker::Lorem.sentence(4)},
:audio_refs => [
{:audio_track => {:id => @audio_track.id}},
{:audio_track => {:user_id => @author.id, :file => File.open("#{Rails.root}/spec/stuff/test.mp3")}}
]
)
@feed_item.save!
@feed_item.reload
@feed_item.audio_refs.length.should be(2)
end
Как видите, причина, по которой я переопределяю метод audio_refs =, заключается в том, что FeedItem может быть создан изсуществующие AudioTracks (когда есть params [: audio_track] [: id]) или из загруженного файла (params [: audio_track] [: file]).
Проблема в том, что @ feed_item.audio_refs.length ==0, когда я запускаю эту спецификацию, т.е. audio_refs не сохраняются.Не могли бы вы помочь мне с этим?
Некоторые исследования:
1) обязательный параметр по умолчанию "true" (это означает, что мы находимся в режиме построения)