y0m*_*mbo 5 activerecord ruby-on-rails foreign-key-relationship
这是一个可以在Ruby on Rails的ActiveRecord模型关系中描述的关系吗?
Customer Address
=================== =========
Billing_Address_Id >------}
}---|- AddressId
Shipping_Address_Id >------}
Run Code Online (Sandbox Code Playgroud)
这样我就可以拥有如下所示的数据:
地址:
Id | Addr | City | State | Zip |
================================================
1 | 123 Main | New York | NY | 99999 |
2 | 200 2nd Street | New York | NY | 99999 |
3 | 300 3rd Street | Albany | NY | 99998 |
4 | PO Box 4 | Albany | NY | 99998 |
Run Code Online (Sandbox Code Playgroud)
顾客:
Id | Name | Billing_Address_Id | Shipping_Address_Id |
=======================================================
1 | Bob | 1 | 1 |
2 | Al | 2 | 1 |
3 | Joe | 3 | 4 |
Run Code Online (Sandbox Code Playgroud)
我想在他们自己的表中存储地址,因为数据可能在客户之间共享(特别是送货地址).但对于任何给定的客户,甚至只有两个地址.
除非没有别的办法,否则我想避免多对多的关系.
是的,完全可以做到这一点.给定一个customers表的两个外键shipping_address_id,并billing_address_id在addresses表中,你Customer的模型看起来是这样的:
class Customer < ActiveRecord::Base
belongs_to :billing_address, :class_name => 'Address'
belongs_to :shipping_address, :class_name => 'Address'
end
Run Code Online (Sandbox Code Playgroud)
这将允许客户引用相同的地址行以用于运送和帐单地址,并且还允许多个客户共享地址.
更新:当共享对这样的地址的引用时,您可能需要仔细考虑如何处理地址更新.在您的示例中,Bob和Al共享相同的送货地址.现在,如果Bob更新了他的送货地址,您可能想要Address为Bob的新地址创建新记录,而不是更新现有记录,以避免更改Al的地址.有时,您实际上可能希望在这种情况下更新两个客户的地址,但在大多数情况下,您可能不会.
给定这样的表定义:
create_table :addresses do |t|
t.string :street
t.string :city
t.string :state
t.string :zip
t.timestamps
end
create_table :customers do |t|
t.string :name
t.references :shipping_address
t.references :billing_address
t.timestamps
end
Run Code Online (Sandbox Code Playgroud)
您可以将帐单和送货地址与您的客户关联起来,如下所示:
class Customer < ActiveRecord::Base
belongs_to :shipping_address, :class_name => "Address"
belongs_to :billing_address, :class_name => "Address"
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
240 次 |
| 最近记录: |