2010-07-27 49 views
1

這個問題與Ruby on Rails的ActiveRecord關聯有關,以及如何生成這些遷移。Ruby on Rails - 有一個屬於很多關係

我試圖建立一個文檔/數據管理系統的Web應用程序,我有兩個模型 - 精氨酸和描述符。 (使描述符成爲對象而不是屬性的原因是多個參數共享相同的描述)。 Args和描述符之間的關係如下:一個Arg只有一個描述符。描述符有許多參數。

基本上,在代碼中,我希望能夠做到以下幾點:

a1 = Arg.first 
a1.descriptor = Descriptor.first 
d1 = Descriptor.last 
d1.args << Arg.last 
d1.args << Arg.first 

目前,我有這個設置:

class Descriptor < ActiveRecord::Base 
    has_and_belongs_to_many :args 
end 

class Arg < ActiveRecord::Base 
    has_one :descriptor 
end 

我也跑這些遷移:

create_table :args do |t| 
    t.string :name 
    t.timestamps 
end 

create_table :descriptors do |t| 
    t.string :name 
    ... 
    t.timestamps 
end 

add_column :descriptors, :switch_id, :integer 

create_table :args_descriptors, :id => false do |t| 
    t.column :arg_id, :integer, :null => false 
    t.column :descriptor_id, :integer, :null => false 
end 

當我嘗試上述所有,我不能得到兩個參數共享一個描述符對象的原因。例如:

>> Arg.first.descriptor 
=> nil 
>> Arg.first.descriptor = Descriptor.last 
=> #<Descriptor id: 9, name: ".... 
>> Arg.last.descriptor 
=> nil 
>> Arg.last.descriptor = Descriptor.last 
=> #<Descriptor id: 9, name: ".... 
>> Arg.first.descriptor 
=> nil 

爲什麼第一個Arg的描述符爲零?我錯過了我的數據庫中的一列嗎?我沒有正確指定關係嗎?

我並不十分精通rails和遷移/數據庫。如果您正在解釋一個概念,請請嘗試提供ActiveRecord代碼示例以及遷移代碼示例。謝謝。

回答

0

你實際上想要在這兩個對象之間建立一箇中間表。在數據庫世界中,這被稱爲「映射」表。在Ruby中,你想通過關聯使用has_many。

http://railscasts.com/episodes/47-two-many-to-many

更新更好的文章,解釋的概念。

2

我相信這些都是你需要的協會和遷移:

class Descriptor < ActiveRecord::Base 
    has_many :args 
end 

class Arg < ActiveRecord::Base 
    belongs_to :descriptor 
end 

create_table :args do |t| 
    t.string :name 
    t.integer :descriptor_id 
    t.timestamps 
end 

create_table :descriptors do |t| 
    t.string :name 
    ... 
    t.timestamps 
end 

注意,如果要存儲對ArgDescriptor之間的關聯額外的信息,那麼你就需要一個連接,你得到的模型使用has_many :through association