更新同时具有belongs_to和has_many关联的文档

时间:2015-06-18 20:02:42

标签: ruby-on-rails mongodb mongoid nomethoderror

每当我更新文档时,我的Rails / Mongoid应用程序都遇到了问题。

我有三个集合:ownersvesselsmodifications

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_manybelongs_to关系)并且每艘船都进行了多次修改(同样,has_manybelongs_to关系)。

创建所有者,船只和更改工作正常。当我尝试更新所有者时,它可以正常工作。如果我尝试更新修改,它也可以。但是,当我尝试更新属于所有者的船只并对其进行了一些修改时,我收到此错误:

  

OwnersController#update中的NoMethodError

     

#Mongoid :: Criteria:0xb50d49d0

的未定义方法`values'

这是抛出此错误的代码。除了修改存储在文档中的数据外,它还会检查所有者是否已更改(这是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_onebelongs_to关联),它就可以正常工作。如果我尝试嵌入相同的交易 - 1-1嵌入更新罚款,1-n嵌入报告相同的错误。如果只有船只及其修改(与所有者无关),它也可以正常工作。当然船只与所有者及其修改相关联,就会发生这种情况。

我正在使用Ruby 1.9.3,Rails 4.2.1,Mongo 2.6.1和Mongoid 4.0.2。

2 个答案:

答案 0 :(得分:0)

显然,修复此问题的方法是从所有者中移除has_many :vessels并从Vessel中删除has_many: modifications,以便生成的代码如下所示:

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

删除这两行后,该应用程序运行正常。

答案 1 :(得分:0)

问题似乎是字段名称,如果任何字段包含单词&#34;更改&#34;将出现错误。希望这能帮到别人。