【问题标题】:Rails: What is the correct Association for these models?Rails:这些模型的正确关联是什么?
【发布时间】:2011-06-24 21:09:06
【问题描述】:

这个问题的正确关联是什么?

共有三种型号:

  • 居民
  • 各方
  • 地址

每个ResidentParty 都有一个Address

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

运行 Rails 3 + MySQL 5.5

【问题讨论】:

  • 多态正是您所需要的。发布您的代码,它只需要一些调试

标签: ruby-on-rails activerecord associations has-and-belongs-to-many polymorphic-associations


【解决方案1】:

我认为不需要多态性

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

【讨论】:

    【解决方案2】:

    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
    

    编辑 按照@klochner 的正确建议,更新了 :has_one -> :belongs_to 关于居民和各方的信息。

    【讨论】:

    • 我认为您希望 belongs_to 在 Resident 和 Party 类中(并且 address_id 会在这些表中)
    • 能否提供一个 Resident 和 Address 表的示例表结构?
    • 使用 has_one 关联意味着该地址将仅属于 1 个居民。根据我的解释,该关联需要是一个belongs_to。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多