Обновление документа, у которого есть ассоциации «member_to» и «has_many»

У меня возникают проблемы с моим приложением 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.


person Nemanja    schedule 18.06.2015    source источник


Ответы (2)


По-видимому, способ исправить это — удалить has_many :vessels из Owner и has_many: modifications из Vessel, чтобы результирующий код выглядел так:

class Owner
    include Mongoid::Document
    field :name, type: String
    field :uprn, type: String
end

class Vessel
    include Mongoid::Document   
    belongs_to :owner
    field :name, type: String
    attr_accessor :uprn
end

class Modification
    include Mongoid::Document   
    belongs_to :vessel  
    field :change_description, type: String
end

После удаления этих двух строк приложение работает нормально.

person Nemanja    schedule 19.06.2015

Проблемы, похоже, связаны с именем поля, если какое-либо поле содержит слово «изменить», появится ошибка. Надеюсь, это поможет другим.

person damianfabian    schedule 08.03.2016
comment
Привет, добро пожаловать в SO. На самом деле это должен быть комментарий, а не ответ. Вы можете комментировать, как только заработаете достаточно репутации. Спасибо. - person Cthulhu; 08.03.2016