Rails: Какова правильная ассоциация для этих моделей? - PullRequest
0 голосов
/ 25 июня 2011

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

Существует три модели:

  • Резиденты
  • Стороны
  • Адреса

Каждый 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

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

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

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
1 голос
/ 25 июня 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 ->: own_to для Резидентов и Сторон, как правильно рекомендовано @klochner.

...