繁体   English   中英

如何在ActiveRecords中的Ruby中创建对对象的引用?

[英]How can I create references to objects in Ruby in ActiveRecords?

我是过去几天一直在学习Rails的Java开发人员。 我有一个Java EE应用程序(将Hibernate用于ORM),试图将其移植到Rails。 我已经使用脚手架生成了一些模型。 但是我还有其他模型,其中包含对其他模型的引用。 如何定义关系? 我也可以搭棚吗?

这是我尝试做的一个例子。

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类?

如果我理解正确,那么您正在寻找关联。 这是您应该阅读的好指南 这里要了解的是,您可以使用该指南中介绍的一系列方法在模型中定义它们之间的关系。

我建议您这样做:

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模型的操纵。

无论如何,我希望这可以帮助您开始找到所需的东西。

您可以使用activerecord迁移的references帮助程序来完成此操作。

rails generate scaffold Car engine:references ...

它将添加:

t.references :engine在您的迁移文件中

has_many :engines汽车模型文件中的has_many :engines

belongs_to :car在您的引擎模型文件中

不要忘记检查Rails api的选项(默认值,关系回调...)(此处为示例: http : //railsapi.com/doc/rails-v3.0.8rc1/

您应该了解有关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

此外,您还必须向Car添加外键engine_id。

之所以可行,是因为Rails中使用了多种约定。

没有基础教程,您将走不通。

没有建立关系的脚手架,您必须学习如何“手工”完成(这不太苛刻)。 看一下“ Rails Guides” ,这里是“ Active Record Association”

在您的示例中,您必须执行以下步骤:

  1. 创建一个迁移来迁移数据库: rails g migration AddIds
  2. 修改迁移以包括您必须具有的其他ID:

     ... add_column :engines, :car_id, :integer 
  3. 向您添加以下代码:

     class Car has_one :engine ... end class Engine belongs_to :car ... end 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM