2013-04-05 4 views
3

Этот трюк работает с отношением «has_many», но не с «embeds_many». Есть идеи?Доступ к родительскому объекту из встроенного документа при создании (Mongoid)

class Country 
    include Mongoid::Document 

    field :name, type: String 
    embeds_many :cities 
end 

class City 
    include Mongoid::Document 

    field :name, type: String 
    field :full_name, type: String, default: ->{ "#{name}, #{country.name}" } 
    embedded_in :country 
end 


1.9.3p392 :025 > c = Country.find_or_create_by(name: 'foo') 
=> #<Country _id: foo, name: "foo"> 

1.9.3p392 :026 > c.cities.find_or_create_by(name: 'bar') 
NoMethodError: undefined method `city' for nil:NilClass 

Таким образом, он не будет работать на линии "поле: full_name, Тип: String, по умолчанию: -> { "# {имя}, {# country.name}"}" becouse страна не определена на тот момент

+1

Сообщение об ошибке «undefined method« city »для nil: NilClass» не соответствует вашему объяснению по умолчанию. Если вы удалите значение по умолчанию, оно пройдет? –

+0

да его пропуск. undefined метод 'city 'для nil: NilClass означает, что страна равна нулю –

ответ

0

Вы должны проверить country первым, то он будет возвращать country.name

field :full_name, type: String, default: ->{ "#{name}, " << country.name if country }

Я не мог заставить это работать с интерполяцией строк, но добавлять произведения (конкатенации country.name к Силе)

Смежные вопросы