【问题标题】:How to keep track of contant rows in ActiveRecord?如何跟踪 ActiveRecord 中的连续行?
【发布时间】:2012-12-09 06:15:51
【问题描述】:

我需要规范化一些数据,而且我是后端/数据库编程的新手,所以这可能很明显,但我已经搜索过并且找不到任何东西。

我有一个'empires' 表。每个帝国可以是'civilization'以下之一:

- British
- French
- Dutch
- Ottoman
- Spanish

现在,empires 表包含一个名为 civilization 的 VARCHAR(255) 类型的列,这就是上述字符串之一的存储位置。

当然,后来我意识到它的可扩展性不是很好,也不是一个好主意,所以我决定创建另一个名为 civilization 的表,其中包含 2 列,id 和包含它的名称的字符串。

我现在的问题是,例如,我如何确保所有'British' Empire 都指向civilization 表中的完全相同的行?

【问题讨论】:

  • 您的意思是您将拥有多个"British" 帝国,并且每个帝国都指向同一个civilization?那将是多对一关联,对吗?

标签: ruby-on-rails ruby activerecord


【解决方案1】:

更新 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:0x0123443 @name="Britain">, <Empire:0x0124543 @name="India"> ]

您需要在empires 表上使用civilization_id 来存储civilizations 记录中的ID。

【讨论】:

  • 是的,但是我如何确保所有“英国”帝国都指向同一个文明“英国”???那是我的问题
  • 啊,好像帝国和文明是一对一的关联,这是真的吗?要回答您的问题,您可以使用 before_create 挂钩在创建时将名称从一个复制到另一个。这些是按什么顺序创建的?帝国然后文明,文明然后帝国,两者同时,还是以上所有?
  • 虽然使用name 而不是id 作为主键似乎是一个完美的主意,但那是not a good idea,因为众所周知它会破坏ROR
  • 这不是 1:1。一个帝国只能有1个文明,一个文明可以有多个帝国。我只是想确保所有英国类型的帝国都指向完全相同的文明。
猜你喜欢
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2021-02-22
相关资源
最近更新 更多