Rails: Какая правильная ассоциация для этих моделей?

Какова правильная ассоциация для этой проблемы?

Есть три модели:

  • Жители
  • Стороны
  • Адреса

У каждого Resident и Party есть Address

Каждый Address может принадлежать Resident или Party или обоим.

Может быть несколько Parties в одном и том же Address и несколько Residents в этом месте.

Является ли связь habtm лучшим решением для этих моделей?

Я пытался сделать полиморфные ассоциации, но возникает конфликт, потому что Address может принадлежать как Resident, так и Party несколько раз.


Я хотел бы иметь возможность делать такие вещи, как...

address = Address.find_or_create_by_street("100 Some Street")

# Associate the Party with a specific Address:
party_object.address = address

# Find all Parties happening at a specific Address:
address.parties do ...

# Find all Residents located at a specific Address:
address.residents.each do ...

Запуск Rails 3 + MySQL 5.5


comment
полиморф - это именно то, что вам нужно. Опубликуйте свой код, ему просто нужна отладка   -  person apneadiving    schedule 25.06.2011


Ответы (2)


Я не вижу необходимости в полиморфизме

class Address < ActiveRecord::Base
  has_many :parties
  has_many :residents
end

class Party < ActiveRecord::Base
  belongs_to :address
end

class Resident < ActiveRecord::Base
  belongs_to :address
end

 # Address can have multiple parties, and multiple residents. 
 # Resident belongs to an address (lives at only 1 address). 
 # A party belongs to an address (party can be only at 1 address).

address = Address.create(:name => "10 something street.")
address.parties << Party.create(:name => "first")
address.parties << Party.create(:name => "second")
address.residents << Resident.create(:name => "John")
address.residents << Resident.create(:name => "Jane")


Party.first.address.name #10 something street.
Resident.first.address.name #10 something street.
address.parties.size #2
address.residents.size #2

Resident.first.address.parties.size #2
person tamersalama    schedule 25.06.2011

Гуру Rails, похоже, прекращают использование habtm. Я думаю, вы можете сделать это с помощью простого has_many:

class Resident < ActiveRecord::Base
  belongs_to :address
end

class Party < ActiveRecord::Base
  belongs_to :address
end

class Address < ActiveRecord::Base
  has_many :residents 
  has_many :parties
end

Из этих ассоциаций вы можете делать такие вещи, как

party.address
address.residents
address.parties
party.address.residents
resident.address.parties

Схема

Схема SQL (без учета значений по умолчанию для Rails), которая будет соответствовать этому, будет выглядеть примерно так:

create_table "residents" do |t|
  t.integer  "address_id"
  t.string   "name"
  ... etc
end

create_table "parties" do |t|
  t.integer  "address_id"
  t.datetime "start_time"
  ... etc.
end

create_table "addresses" do |t|
  t.string   "first_line"
  ...etc.
end

РЕДАКТИРОВАТЬ Обновлено :has_one -> :belongs_to для резидентов и сторон, как правильно посоветовал @klochner.

person Peter Nixey    schedule 24.06.2011
comment
Я думаю, вы хотите, чтобы created_to был в классах Resident и Party (и address_id был бы в этих таблицах) - person klochner; 25.06.2011
comment
не могли бы вы предоставить пример структуры таблицы для таблиц Resident и Address? - person Marco; 25.06.2011
comment
Использование ассоциации has_one означает, что адрес будет принадлежать только 1 резиденту. Согласно моему объяснению, ассоциация должна быть принадлежности_к. - person tamersalama; 25.06.2011