如何在 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文档的引用

在 C++ 中创建对三元运算符结果的 const 引用是不是安全?

无法在 XAML 中创建对其他项目的 xmlns 引用

尝试在 C 中创建对所有人具有完全权限的文件