将一对多的关系与同一个表中的两个外键Ruby on rails

时间:2014-11-09 01:43:28

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2

我有一张名为customers的表。这些表有两个地址。一个工作地址和一个房子的直接

这两个地址属于一个名为地址的表 我不知道如何关联这两个表

迁移

 class CreateCustomers < ActiveRecord::Migration
  def change
    create_table :customers do |t|
      t.string :name
      t.integer :address_id   #Address of work
      t.integer :address_id_1 #Address of home
      t.timestamps
    end
  end
end

class CreateAdresses < ActiveRecord::Migration
  def change
    create_table :adresses do |t|
      t.string :street
      t.timestamps
    end
  end
end

1 个答案:

答案 0 :(得分:0)

我不相信这是一种好方法或数据库设计。如果您想以这种方式继续而不是脱离轨道惯例,只需创建两列address_idaddress_two_id

并在 customer.rb

belongs_to :address, class_name: "Address"
belongs_to :address_two, class_name: "Address"

默认情况下,rails获取外键的名称并将其存储在名为“name”+“_ id”的列中


更好的方法是,在您的customer_id模型中有两个列Address并在您的客户类中创建关系

<强> customer.rb

has_many :addresses

您还可以通过将此验证添加到

来验证客户的地址不超过两个

<强> address.rb

validate :validate_two_addresses

def validate_two_addresses
  address_count = Address.where(customer_id: self.customer_id).count
  errors.add(:base, "You cannot have more than 2 addresses.") unless address_count < 3
end