У меня возникают проблемы с моим приложением Rails/Mongoid всякий раз, когда я обновляю свои документы.
У меня три коллекции: owners
, vessels
и modifications
.
class Owner
include Mongoid::Document
has_many :vessels
field :name, type: String
field :uprn, type: String
end
class Vessel
include Mongoid::Document
belongs_to :owner
has_many :modifications
field :name, type: String
attr_accessor :uprn
end
class Modification
include Mongoid::Document
belongs_to :vessel
field :change_description, type: String
end
Идея состоит в том, что каждый владелец владеет несколькими судами (существуют отношения has_many
, belongs_to
) и что на каждое судно было внесено несколько модификаций (опять же, отношения has_many
, belongs_to
).
Создание владельцев, сосудов и изменений работает просто отлично. Когда я пытаюсь обновить владельца, это работает. Если я пытаюсь обновить модификацию, она также работает. Однако в тот момент, когда я пытаюсь обновить судно, которое принадлежит владельцу и на котором сделаны некоторые модификации, я получаю эту ошибку:
NoMethodError в OwnersController#update
неопределенный метод `values' для # Mongoid::Criteria:0xb50d49d0
Вот код, который выдает эту ошибку. Помимо простого изменения данных, хранящихся в документе, он также проверяет, изменился ли владелец (именно здесь появляется поле uprn), и соответствующим образом изменяет owner_id.
def update
@vessel = Vessel.find(params[:id])
@owner = Owner.find_by(uprn: params[:vessel][:uprn])
if @owner.present?
@vessel.owner_id = @owner.id
if @vessel.update(vessel_params)
redirect_to @vessel
else
render 'edit'
end
else
@vessel.errors[:base] << "There is no owner with the UPRN entered."
render 'edit'
end
end
Обратите внимание, что это происходит только тогда, когда между ними существует связь 1-n. Если есть только одна модификация на судно (то есть ассоциация has_one
, belongs_to
), все работает отлично. То же самое, если я попытаюсь встроить - 1-1 встраивание обновляется нормально, 1-n встраивания сообщают об одной и той же ошибке. Также отлично работает, если есть только судно и его модификации (без привязки к владельцу). В тот момент, когда судно ассоциируется как с владельцем, так и с его модификациями, происходит это.
Я использую Ruby 1.9.3, Rails 4.2.1, Mongo 2.6.1 и Mongoid 4.0.2.