2012-12-09 20 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