基本Rails问题:手动将行插入数据库表

时间:2008-12-14 19:58:42

标签: ruby-on-rails ruby activerecord

我正在学习Rails,到目前为止一切顺利。我目前最大的问题是:如何手动在我的数据库中插入一行?我已经有了用于创建DataTypeOne行的脚手架,但是我希望在提交DataTypeOne的表单时创建一行DataTypeTwo(并让它引用DataTypeOne的id ...但我想我可以使用它出我自己的。)

提前致谢。

7 个答案:

答案 0 :(得分:5)

您可以通过创建和保存新的ActiveRecord对象(您的模型)在数据库中创建行。

因此,在您的控制器代码中,您可以通过执行

创建一个新的DataTypeTwo行
new_record = DataTypeTwo.new
new_record.save!

答案 1 :(得分:4)

正如frankodwyer所说,你真的想要使用Rails协会来陈述一个模型与另一个模型相关的事实。如果存在一对一的关系,那么您将使用

belongs_to

<强> HAS_ONE

根据具有外键的型号,您可以使用其中一种。在您的示例中,听起来像DataTypeTwo具有外键,返回DataTypeOne。所以你会有这样的事情:

class DataTypeTwo < ActiveRecord::Base
  belongs_to :data_type_one
end


class DataTypeOne < ActiveRecord::Base
  has_one :data_type_two
end

你可以用这样的外键创建记录

one = DataTypeOne.create(...)
two = DataTypeTwo.create(...)
two.data_type_one = one
two.save

有一些快捷方式,但这是它的冗长要点。假设您可以通过反射获得所有模型名称和外键,那么您就可以了,否则您必须明确地为键命名。

所有这些都在ActiveRecord文档中详细介绍:

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

答案 2 :(得分:1)

除了像Cody Caughlan所描述的那样设置适当的ActiveRecord关联之外,听起来你应该使用ActiveRecord回调来保证在创建DataTypeOne时,创建DataTypeTwo并将其与DataTypeOne相关联。根据您的需要,我猜测before_createafter_create可以解决问题。

有关更多详细信息,请参阅ActiveRecord::Callbacks的Rails文档。

答案 3 :(得分:1)

如果您需要更灵活,活动记录还为大多数SQL操作提供了一个sql接口:Database Statements

答案 4 :(得分:1)

这是一个很常见的事情,你应该能够通过你的模型做到这一点,而不必考虑手动对数据库做任何事情。

例如,如果您希望DataTypeTwo引用DataTypeOne,那是因为DataTypeTwo'属于'DataTypeOne?或者DataTypeOne'有很多'DataTypeTwo? Rails具有表达所有这些关系和其他关系的约定。当您调用“保存!”时,应将对象和相关项目保存到数据库中。关于相关对象的方法。

你应该看一些更多的rails示例和教程来解决这个问题。除非你做了一些非常不寻常的事情,否则你不应该做更多的事情来注释你的模型并遵循惯例,这样rails就知道什么属于什么。

答案 5 :(得分:1)

您还可以使用以下快捷方式:

DataTypeTwo.create

create方法将创建一个新的DataTypeTwo对象并将记录保存到数据库中。

答案 6 :(得分:1)

您不需要仅使用脚手架在数据库中创建条目。您需要做的就是

./script/console (from your project folder)

这将为您的项目提供命令行驱动的完整Rails环境。你可以在这里尝试任何东西。在您的上下文中,您可以

record = DataTypeTwo.new(:field1 => value1, :field2 => value2)
record.save

在将内容放入代码之前,控制台也是尝试内容的最佳方式