0

这个问题的正确关联是什么?Rails:这些模型的正确关联是什么?

有三种型号:

  • 居民
  • 缔约方
  • 地址

每个ResidentPartyAddress

每个Address可以属于一个ResidentParty或两者。

可以有多个Parties在相同的Address和多个Residents住在那个位置。

是一个habtm关系这些模型的最佳解决方案?

我看着做多态关联但发生了冲突,因为Address可能同时属于ResidentParty多张倍


我希望能够做的事情一样......

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 ... 

的运转轨道3 + MySQL的5.5

+0

多态是你所需要的东西。发布你的代码,它只需要一些调试 – apneadiving

回答

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 
1

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 

EDIT 已更新:has_one - >:belongs_to在居民和派对上,由@klochner正确建议。

+0

我想你想在belongsals居民和党类(和address_id将在那些表) – klochner

+0

你可以请提供一个示例表结构的居民和地址表? – Marco

+0

使用has_one关联意味着该地址将只属于一个居民。根据我的解释,该协会必须是一个belongs_to。 – tamersalama

相关问题