2012-12-09 21 views
-1

我需要正常化一些數據,而且我是後端/數據庫編程的新手,所以這可能非常明顯,但我已經搜索並找不到任何東西。如何跟蹤ActiveRecord中的contant行?

我有一個'empires'表。每個帝國可以是以下的'civilization'之一:

- British 
- French 
- Dutch 
- Ottoman 
- Spanish 

眼下,empires表包含類型的列VARCHAR(255)稱爲civilization,這就是上面的字符串的一個存儲位置。

當然,後來我意識到它不是很好的可擴展性,也不是一個好主意,所以我決定創建另一個名爲civilization的表,它包含2列,id和包含它名字的字符串。

我現在的問題是,我如何確保所有的'British'帝國都會指向civilization表中的同一行?

+0

你是說你有多個英國帝國,每個帝國都指向同一個「文明」?這將是多對一的協會,我是對的嗎? – PeterWong

回答

0

更新2:1對多的關聯

class Empire < ActiveRecord::Base 
    attr_accessible :name 
    belongs_to :civilization 
end 

class Civilization < ActiveRecord::Base 
    attr_accessible :name 
    has_many :empires 
end 

british = Civilization.new(:name => 'British') 
british.empires.build(:name => 'Britian') 
british.empires.build(:name => 'India') 
british.save 

india = Empire.where(:name => 'India') 
britain = Empire.where(:name => 'Britain') 

puts india.civilization == britain.civilization # => true 
puts india.civilization.inspect     # => <Civilization:0x04121231 @name="British"> 
puts india.civilization.empires.inspect   # => [ <Empire:[email protected]="Britain">, <Empire:0x0124543 @name="India"> ] 

你會需要一個civilization_idempires表的ID從civilizations記錄存儲。

+0

一般:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many – bitstrider

+0

是的,但我如何確保所有'英國'的帝國指向同一個文明'英國'???那是我的問題 – 0xSina

+0

啊好像帝國和文明有1對1的關係,這是真的嗎?要回答你的問題,你可以使用'before_create'掛鉤在創建時將名字從一個名字複製到另一個名字。它們以什麼順序創建?帝國然後是文明,然後是帝國的文明,兩者同時還是全部以上? – bitstrider