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

时间:2011-10-04 11:02:56

标签: ruby-on-rails ruby activerecord relationships scaffold

我是一名Java开发人员,过去几天我一直在学习Rails。我有一个Java EE应用程序(使用Hibernate for 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类?

4 个答案:

答案 0 :(得分:3)

如果我理解正确您正在寻找关联。这是一个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模型。这将允许您从控制器和Car模型的视图管理Engine模型的操作。

无论如何,我希望这有助于你开始找到你需要的东西。

答案 1 :(得分:1)

您可以使用activerecord migration的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/

答案 2 :(得分:1)

您应该了解有关Ruby的更多信息。 Ruby不是一种静态语言,这意味着每个变量都可以容纳各种对象。

rails generate命令仅使用阀门:整数等用于数据库目的,因为数据库需要此信息。

关于你的关系问题,你应该阅读有关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中使用了几种约定。

如果没有基础教程,你就不会走得太远。

答案 3 :(得分:1)

关系没有脚手架,你必须“手工”学习如何做到这一点(这不是太苛刻)。请查看"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