Rails 以一种形式创建多个相互关联的对象
Rails create multiple interrelated objects in one form
我有一个 Vehicles
模型,其中每辆车都有 make
和 model
。当用户创建车辆时,他们可以 select 当前可用的品牌和型号,也可以创建新的品牌和型号。 make
和 model
都不包含额外的数据,因此它们存储在我用于动态枚举的 CommonLookup
模型中。
我想根据当前 selected make
通过 ajax 限制 model
选择。为此,我在 CommonLookup
模型自身上创建了一个 blongs_to
关系;换句话说,该类型的任何记录都可以选择在多对一关系中引用相同类型的 parent
记录。
我 运行 遇到的问题实际上是挽救关系。我的模型代码用于创建不相关的 make
和 model
记录,如下所示:
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 请求更容易设置,因为我可以轻松找到与每个品牌关联的模型并将它们放在选项列表中。
我有一个 Vehicles
模型,其中每辆车都有 make
和 model
。当用户创建车辆时,他们可以 select 当前可用的品牌和型号,也可以创建新的品牌和型号。 make
和 model
都不包含额外的数据,因此它们存储在我用于动态枚举的 CommonLookup
模型中。
我想根据当前 selected make
通过 ajax 限制 model
选择。为此,我在 CommonLookup
模型自身上创建了一个 blongs_to
关系;换句话说,该类型的任何记录都可以选择在多对一关系中引用相同类型的 parent
记录。
我 运行 遇到的问题实际上是挽救关系。我的模型代码用于创建不相关的 make
和 model
记录,如下所示:
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 请求更容易设置,因为我可以轻松找到与每个品牌关联的模型并将它们放在选项列表中。