【问题标题】:Ruby on Rails/Activerecord mySQL modelingRuby on Rails/Activerecord mySQL 建模
【发布时间】:2010-07-23 01:28:48
【问题描述】:

这确实是一个非常简单的问题,但假设我正在为 Person 创建一个模型。人显然有名字、姓氏、年龄等。但这个人也有联系信息,包括地址行 1、地址行 2、城市、州、邮编、国家、电话 1、电话 2 等...

为 Person 创建一个模型,然后将该联系人信息列为模型中的表,或者还创建一个 ContactInfo(或 Address 等)模型,然后通过关联(Person has_one ContactInfo/Person has_one Address/Address belongs_to Person等)?

以下哪种方法更好?每种方法的优点/缺点是什么?

编辑:关于 j..

那么使用这种方法,我是否必须创建一个可寻址模型?

script/generate model Addressable

class Addressable < ActiveRecord::Base
    #stuff here?
end

或者这是不必要的?

另外,我需要将此行添加到 create_users.rb:

t.references :addressable, :polymorphic => true

我觉得我错过了什么,但我不确定是什么。我非常感谢您的帮助,顺便说一句!谢谢!

【问题讨论】:

  • 我刚刚更新了我的答案:]

标签: mysql ruby-on-rails activerecord


【解决方案1】:

我会为地址、电话和类似的东西创建单独的表/模型,并将它们设为polymorphic。像这样:

class Address < ActiveRecord::Base
   belongs_to :addressable, :polymorphic => true
end

class Person < ActiveRecord::Base
   has_one :address, :as => :addressable
end

我相信这是最好的方法,因为稍后您可能需要添加例如 Company 模型,并且很容易使其成为 addressable

编辑

address 为例,您需要Address 模型,而不是Addressable

你必须添加

t.references :addressable, :polymorphic => true

t.belongs_to :addressable, :polymorphic => true

到您的create_addresses 迁移,因此您将在addresses 表中拥有addressable_idaddressable_type

如果您有任何其他疑问,请告诉我:]

【讨论】:

  • 感谢您的帮助!我更新了我的问题以反映您提供给我的信息。
【解决方案2】:

上面的答案是有道理的,但请考虑一下您需要多少字段以及必须管理多少记录。为每个额外的字段创建一个表可能太费力了。

另一种方法可能更灵活:创建一个包含 3 个字段的表(例如,person_details):person_id:integer、field_name:string、field_data:string,然后是模型:

class PersonDetail < ActiveRecord::Base
  belongs_to :person
end

这样您就可以添加您需要的任何附加字段:phone1..phoneN、address1..addressN 等等。

另一种类似的方法是预先确定字段名称,以避免在插入期间不同的标签

class PersonDetail < ActiveRecord::Base
  belongs_to :person

  FIELD_NAMES => { 'Address' => 1, 'Phone' => 2)
end

在这种情况下,您将 field_name 声明为整数(因为它只存储哈希值,而不是字符串)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多