1

我是一名 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 类?

4

4 回答 4

3

如果我理解正确,您正在寻找关联。这是一个很棒的指南 ,你应该阅读。这里要理解的是,您在模型中使用该指南中描述的一系列方法定义它们如何相互关联。

以下是我建议您执行的操作:

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

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

于 2011-10-04T11:12:17.517 回答
1

您可以使用referencesactiverecord 迁移的助手来完成。

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/ )

于 2011-10-04T11:10:26.957 回答
1

你应该了解更多关于 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 中使用了几种约定。

如果没有基本教程,您将不会走得太远。

于 2011-10-04T11:11:53.977 回答
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
    
于 2011-10-04T11:13:15.300 回答