可以在Ruby on Rails中描述这种关系吗?

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)

我想在他们自己的表中存储地址,因为数据可能在客户之间共享(特别是送货地址).但对于任何给定的客户,甚至只有两个地址.

除非没有别的办法,否则我想避免多对多的关系.

Pär*_*der 5

是的,完全可以做到这一点.给定一个customers表的两个外键shipping_address_id,并billing_address_idaddresses表中,你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的地址.有时,您实际上可能希望在这种情况下更新两个客户的地址,但在大多数情况下,您可能不会.


Rya*_*ary 2

给定这样的表定义:

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)