在控制器方法内的数据库中插入

时间:2012-04-26 11:59:36

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我想在控制器的方法中在数据库中进行两次插入操作:

a = A.new(:dog_id => b.id, ...)
a.save
b = B.new(:cat_id => a.id , ... )
b.save

我是如何做到这一点的,因为我需要a中的a的id和b中的b的id

2 个答案:

答案 0 :(得分:2)

首先使用正确的关联设置模型A + B

Model Cat
  has_one :dog
  accepts_nested_attributes_for :dog

Model Dog
  has_one :cat
  accepts_nested_attributes_for :cat

我将模型基于您提供的代码,其中A的每个实例只能有一个B,反之亦然。您也可以使用belongs_to代替old explanation from 2006

Accepts_nested_attributes_for允许您在原始模型accepts_nested_attributes_for的参数中传递关联模型的属性 请注意,如果您需要many_to_many try has_and_belongs_to_many

,此关系只能接受A和B(猫和狗)之间的单一关系

在控制器中构建模型的实例并设置它们的关联。

this_cat = Cat.new(cat_attributes{dog_attributes})

this_cat.save!

非常肯定有几种方法可以做到这一点,但正如Aldo所说,问题代码的更多细节将有助于澄清一些关联 - 因为我可能会错误地想到你希望如何功能

不使用accepts_nested_attributes_for的另一种方法是构建A和B的每个实例,保存其中一个,执行关联然后保存它们。

this_cat = Cat.new(cat_attributes)
this_dog = Dog.new(dog_attributes)
this_dog.save!    
this_cat.dog = this_dog
this_cat.save!
this_dog.save!

答案 1 :(得分:1)

A,B,C?你有什么要做的?如果您的Category模型有许多狗,而Dog模型属于某个类别,那么您只需拥有类别,当您创建新狗时,只需使用dog.category = Category.find_by_name(category_name)分配类别

...但我怀疑你在狗和类别之间存在某种多对多的关系,在这种情况下你需要另一个模型和数据库表......

更新:对我没有任何意义,尝试提供更多详细信息......另一个想法是创建两个对象,然后更新:

# Create the two objects
a = A.create
b = B.create
# Update a with the B id
a.dog = b
a.save
# Update b with the A id
b.cat = a
a.save

但同样,你应该更新你的答案来解释你想要实现的目标