Ruby on Rails / Activerecord mySQL моделирование - PullRequest
0 голосов
/ 15 июля 2010

Это довольно простой вопрос на самом деле, но допустим, я создаю модель для Person. У человека, очевидно, есть имя, фамилия, возраст и т. Д. Но у человека также есть контактная информация, состоящая из таких элементов, как адресная строка 1, адресная строка 2, город, штат, почтовый индекс, страна, телефон 1, телефон 2 и т. Д.

Имеет ли смысл создавать модель для Person и затем перечислять эту контактную информацию в виде таблиц в модели или также создавать, скажем, модель ContactInfo (или Address и т. Д.), А затем связывать Person с ContactInfo через ассоциация (Лицо has_one ContactInfo / Лицо has_one Адрес / Адрес принадлежит_ Лицу и т. д.)?

Какой из них является лучшим подходом и каковы преимущества / недостатки каждого метода?

редактировать: в отношении к ..

Итак, при таком подходе мне нужно было бы создать адресуемую модель?

script/generate model Addressable

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

или это не нужно?

Кроме того, мне нужно добавить эту строку в create_users.rb:

t.references :addressable, :polymorphic => true

Я чувствую, что что-то упустил, но я не уверен, что. Я ценю помощь за тонну, кстати! Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

Я бы создал отдельные таблицы / модели для адреса, телефона и тому подобного и сделал бы их polymorphic.Вот так:

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

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

Я считаю, что это лучший способ, потому что позже вам может понадобиться добавить, например, модель компании, и вам будет легко сделать ее addressable.

Редактировать

Используя address в качестве примера, вам понадобится модель Address, а не Addressable.

И вам придетсядобавьте

t.references :addressable, :polymorphic => true

или

t.belongs_to :addressable, :polymorphic => true

к вашей миграции create_addresses, чтобы в таблице addresses были addressable_id и addressable_type.

Дайте мне знать, если у вас есть другие сомнения:]

1 голос
/ 15 июля 2010

ответ выше имеет смысл, но подумайте о том, сколько полей вам нужно и сколько записей вы должны управлять.создание таблицы для каждого дополнительного поля может быть слишком сложным.

другой подход может быть более гибким: создать таблицу (скажем, person_details) с 3 полями: 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 как целое число (поскольку оно хранит только значение хеша,не строка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...