如何在 ActiveRecords 中创建对 Ruby 中对象的引用?
Posted
技术标签:
【中文标题】如何在 ActiveRecords 中创建对 Ruby 中对象的引用?【英文标题】:How can I create references to objects in Ruby in ActiveRecords? 【发布时间】:2011-11-30 14:32:22 【问题描述】:我是一名 Java 开发人员,过去几天我一直在学习 Rails。我有一个试图移植到 Rails 的 Java EE 应用程序(使用 Hibernate for ORM)。我使用脚手架生成了一些模型。但我有其他模型包含对其他模型的引用。我如何定义关系?我也可以用脚手架吗?
这是我正在尝试做的一个示例。
public class Engine
private int valves;
private int capacity;
private int rpm;
只需执行以下操作,我就可以在 ruby 中搭建 Engine 类:
rails generate scaffold Engine valves:integer capacity:integer rpm:integer
这对我来说是棘手的部分:
public class Car
private Engine engine;
如何在 Ruby 中搭建 Car 类?
【问题讨论】:
【参考方案1】:如果我理解正确,您正在寻找关联。这是great guide 你应该阅读。这里要理解的是,您在模型中使用该指南中描述的一系列方法来定义它们之间的关系。
我建议你这样做:
rails generate scaffold Car <db columns>
rails generate model Engine valves:integer capacity:integer rpm:integer car_id:integer
在你的两个模型中:
class Car < ActiveRecord::Base
has_one :engine
end
class Engine < ActiveRecord::Base
belongs_to :car
end
您实际上可以为这两个模型生成脚手架......这将创建控制器和视图。但在这种情况下,添加
可能是有意义的accepts_nested_attribues_for :engine
改为您的汽车模型。这将允许您从控制器和 Car 模型的视图中管理 Engine 模型的操作。
无论如何,我希望这可以帮助您开始找到您需要的东西。
【讨论】:
【参考方案2】:您可以使用活动记录迁移的references
助手来完成。
rails generate scaffold Car engine:references ...
它会添加:
t.references :engine
在您的迁移文件中
has_many :engines
在您的汽车模型文件中
belongs_to :car
在您的引擎模型文件中
不要忘记检查 rails api 的选项(默认,关系回调...)(这里例如:http://railsapi.com/doc/rails-v3.0.8rc1/)
【讨论】:
【参考方案3】:您应该了解更多关于 Ruby 的信息。 Ruby 不是一门静态语言,这意味着每个变量都可以容纳各种对象。
rails generate 命令使用valves:integer 等仅用于数据库目的,因为数据库需要这些信息。
关于您的关系问题,您应该阅读有关 has_many、bleongs_to 等的信息(请参阅http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html)在 Rails 中,您可以像这样定义您的关系
class Car
belongs_to :engine
end
class Engine
has_many :cars
end
此外,您必须将外键 engine_id 添加到 Car。
之所以可行,是因为 Rails 中使用了多种约定。
没有基础教程,你不会走得太远。
【讨论】:
我对这个答案的唯一想法是 has_many 可能不是正确的方法。在我看来,一个引擎实例一次只能在一辆汽车中......而且我没有在模型表列中看到任何元数据,使其看起来像一种引擎。同样,我建议查看association guide 你可能是对的。我假设 Engine 是一种类型,因为在 Engine 类中没有任何类型信息的指示。【参考方案4】:关系没有脚手架,您必须学习如何“手工”完成(要求不高)。看看"Rails Guides",这里是"Active Record Association"。
在您的示例中,您必须执行以下步骤:
-
创建迁移以迁移数据库:
rails g migration AddIds
修改迁移以包含您必须拥有的其他 ID:
...
add_column :engines, :car_id, :integer
将以下代码添加到您的模型中:
class Car
has_one :engine
...
end
class Engine
belongs_to :car
...
end
【讨论】:
以上是关于如何在 ActiveRecords 中创建对 Ruby 中对象的引用?的主要内容,如果未能解决你的问题,请参考以下文章
在Firestore中创建对Cloud Storage文档的引用