Rails 以一种形式创建多个相互关联的对象

Rails create multiple interrelated objects in one form

我有一个 Vehicles 模型,其中每辆车都有 makemodel。当用户创建车辆时,他们可以 select 当前可用的品牌和型号,也可以创建新的品牌和型号。 makemodel 都不包含额外的数据,因此它们存储在我用于动态枚举的 CommonLookup 模型中。

我想根据当前 selected make 通过 ajax 限制 model 选择。为此,我在 CommonLookup 模型自身上创建了一个 blongs_to 关系;换句话说,该类型的任何记录都可以选择在多对一关系中引用相同类型的 parent 记录。

我 运行 遇到的问题实际上是挽救关系。我的模型代码用于创建不相关的 makemodel 记录,如下所示:

class Vehicle < ActiveRecord::Base
    belongs_to :make, :class_name => "CommonLookup", :foreign_key => "make_id"
    belongs_to :model, :class_name => "CommonLookup", :foreign_key => "model_id"
    attr_accessor :new_make_name
    attr_accessor :new_model_name

    before_save :create_make_from_name, :create_model_from_name
    def create_make_from_name
        create_make(
            :value => new_make_name
        )
    end

    def create_model_from_name
        create_model(
            :value => new_model_name
        )
    end
end

此代码成功创建了具有关联的新品牌和型号的车辆,但新品牌和型号并未像我需要的那样相互关联。我需要一个多模型对一模型的关系,我可以用它来轻松地限制选择。需要明确的是,这个问题与限制选择所必需的 ajax 部分无关;我专注于模型实例本身的创建,以便它们相互关联,所有这些都来自一个表单。

我试图在 create_model_from_name 回调中设置代码但无济于事;没有对在第一个回调中创建的可用于建立关系的对象的可访问引用。我尝试了什么:

def create_model_from_name
    create_model(
        :value => new_model_name,
        :parent => :make
    )
end

但这没有用。任何帮助将不胜感激。

我通过组合 before_save 回调并包含更多逻辑来解决这个问题:

class Vehicle < ActiveRecord::Base
    belongs_to :make, :class_name => "CommonLookup", :foreign_key => "make_id"
    belongs_to :model, :class_name => "CommonLookup", :foreign_key => "model_id"
    attr_accessor :new_make_name
    attr_accessor :new_model_name
    before_save :create_make_and_model_from_names

    def create_make_and_model_from_names
        if not new_model_name.blank?
            if not new_make_name.blank?
                create_model(
                    :value => new_model_name,
                    :parent => create_parent(
                        :value => new_make_name
                    )
                )
            else
                create_model(
                    :value => new_model_name,
                    :parent => model
                )
            end
        end
    end
end

这满足了我的要求,它设置了一种创建新品牌以及创建新模型并将其与新品牌和现有品牌相关联的方法。最终结果是我的 ajax 请求更容易设置,因为我可以轻松找到与每个品牌关联的模型并将它们放在选项列表中。