Ruby on rails 基本Rails问题:手动将行插入数据库表
我正在学习Rails,目前进展顺利。目前我最大的问题是:如何手动将一行插入数据库?我已经准备好了创建DataTypeOne行的脚手架,但我希望在提交DataTypeOne表单时创建DataTypeTwo行(并让它引用DataTypeOne的id…但我想我可以自己解决这个问题)Ruby on rails 基本Rails问题:手动将行插入数据库表,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在学习Rails,目前进展顺利。目前我最大的问题是:如何手动将一行插入数据库?我已经准备好了创建DataTypeOne行的脚手架,但我希望在提交DataTypeOne表单时创建DataTypeTwo行(并让它引用DataTypeOne的id…但我想我可以自己解决这个问题) 提前感谢。您可以通过创建和保存新的ActiveRecord对象(您的模型)在数据库中创建行 因此,在控制器代码中,您可以通过 new_record = DataTypeTwo.new new_record.save! 这
提前感谢。您可以通过创建和保存新的ActiveRecord对象(您的模型)在数据库中创建行 因此,在控制器代码中,您可以通过
new_record = DataTypeTwo.new
new_record.save!
这是一件非常常见的事情,您应该能够通过您的模型来完成,而不必考虑手动对数据库执行任何操作 例如,如果您希望DataTypeTwo引用DataTypeOne,是否因为DataTypeTwo“属于”DataTypeOne?或者DataTypeOne“有很多”DataType2的东西?Rails具有表示所有这些类型的关系和其他关系的约定。调用“保存”时,将对象和相关项保存到数据库应该是自动的方法在相关对象上执行
您应该看看更多的rails示例和教程来了解这一点。除非您正在做一些非常不寻常的事情,否则您不需要做更多的事情,只需注释您的模型并遵循约定,这样rails就知道什么属于什么。您还可以使用以下快捷方式:
DataTypeTwo.create
create方法将创建一个新的DataTypeTwo对象并将记录保存到数据库中。正如frankodwyer所说,您确实希望使用Rails关联来声明一个模型与另一个模型相关的事实。如果存在一对一的关系,那么您将使用 属于 及 有一个 根据具有外键的型号,可以使用其中一个。在您的示例中,听起来DataTypeTwo具有外键,返回到DataTypeOne。所以你会有这样的想法:
class DataTypeTwo < ActiveRecord::Base
belongs_to :data_type_one
end
class DataTypeOne < ActiveRecord::Base
has_one :data_type_two
end
有一些捷径,但这是它冗长的要点。假设所有的模型名和外键都可以通过反射获得,那么就可以了,否则就必须显式地命名这些键
ActiveRecord文档详细介绍了所有这些:
除了像Cody Caughlan所描述的那样设置适当的ActiveRecord关联之外,听起来您应该使用ActiveRecord回调来保证在创建DataTypeOne时,DataTypeTwo被创建并与DataTypeOne关联。根据您的需要,我猜创建之前的
或创建之后的会起作用
有关更多详细信息,请参阅的Rails文档 如果您需要更灵活,active records还为大多数sql操作提供了一个sql接口:您不需要使用脚手架在数据库中创建条目。你需要做的就是
./script/console (from your project folder)
这将为您的项目提供一个命令行驱动的完整Rails环境。你可以在这里尝试任何东西。在你的背景下,你可以这样做
record = DataTypeTwo.new(:field1 => value1, :field2 => value2)
record.save
控制台也是在将内容放入代码之前试用的最佳方式如何指定列数据?@takua108:请告诉我们您是如何指定列数据的!基本上我有节点和连接器。连接器将节点连接到多个节点。当我创建一个新节点时,我希望用户能够创建新的连接器,而这些连接器不会导致新节点……就像维基百科中的“红色链接”。这些节点/连接是否应该作为某种图形或树?您也可以在rails中找到此类内容的注释/插件。寻找像acts_as_graph/acts_as_tree等插件。
record = DataTypeTwo.new(:field1 => value1, :field2 => value2)
record.save