2011-10-04 58 views
1

我是Java開發人員過去幾天我一直在學習Rails。我有一個Java EE應用程序(使用Hibernate for ORM),我嘗試移植到Rails。我用腳手架生成了一些我的模型。但我有其他模型,其中包含其他模型的參考。我如何定義關係?我也可以搭腳手嗎?如何在ActiveRecords中的Ruby中創建對象的引用?

這是我正在嘗試做的一個例子。

public class Engine { 
    private int valves; 
    private int capacity; 
    private int rpm; 
} 

我可以做腳手架紅寶石Engine類以下內容:

rails generate scaffold Engine valves:integer capacity:integer rpm:integer 

這裏對我來說是棘手的部分:

public class Car { 
    private Engine engine; 
} 

如何腳手架Car類在Ruby中?

回答

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 

實際上,你可以生成兩種型號的支架......這將創建控制器和視圖。但在這種情況下,將其替換爲您的汽車模型可能更有意義。這將允許您從控制器和Car模型的視圖管理Engine模型的操作。

無論如何,我希望這可以幫助你開始找到你需要的東西。

1

您可以使用activerecord遷移的幫助器references

rails generate scaffold Car engine:references ...

它將增加:

t.references :engine在遷移文件

在您的汽車模型文件

在您的發動機模型文件belongs_to :carhas_many :engines

不要忘記檢查rails api的選項(默認,關係ca )(例如:http://railsapi.com/doc/rails-v3.0.8rc1/

1

您應該瞭解更多關於Ruby的知識。 Ruby不是一種靜態語言,這意味着每個變量都可以容納各種對象。

導軌生成命令使用閥門:整數等僅用於數據庫目的,因爲數據庫需要此信息。

關於你的關係的問題,您應該閱讀有關的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添加到車。

這是可行的,因爲在Rails中有幾個約定。

沒有一個基本的教程,你不會走得太遠。

+0

我唯一想到這個答案的是has_many可能不是正確的方法。在我看來,一個引擎的實例一次只能在一個汽車中......而且我沒有在模型表列中看到任何元數據,使它看起來像一種引擎。再次,我建議查看[協會指南](http://guides.rubyonrails.org/association_basics.html) – jaydel

+1

您可能是對的。我認爲Engine是一種類型,因爲Engine類中沒有任何類型信息。 – ayckoster

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 
    
相關問題