【问题标题】:How can I create references to objects in Ruby in ActiveRecords?如何在 ActiveRecords 中创建对 Ruby 中对象的引用?
【发布时间】: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 类?

【问题讨论】:

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


    【解决方案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"

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

        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
          

        【讨论】:

          猜你喜欢
          • 2019-08-25
          • 2017-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-02
          相关资源
          最近更新 更多