Rails如何在模型之间创建关系

时间:2017-11-30 19:19:33

标签: ruby-on-rails ruby postgresql shopify shopify-app

我正在开发Shopify应用程序,我正在尝试在我的数据库中创建一个关系,我有一个商店模型和一个地址模型,一个商店可以有不同的地址,每个地址都与一个商店有关。< / p>

所以我有这个:

模型/ shop.rb

class Shop < ActiveRecord::Base
  include ShopifyApp::SessionStorage
  has_many :addresses
end

模型/ address.rb

class Address < ApplicationRecord
    belongs_to :shop
end

分贝/迁移/ create_shops.rb

class CreateShops < ActiveRecord::Migration[5.1]
    has_many :addresses
  def self.up
    create_table :shops  do |t|
      t.string :shopify_domain, null: false
      t.string :shopify_token, null: false
      t.timestamps
    end

    add_index :shops, :shopify_domain, unique: true
  end

  def self.down
    drop_table :shops
  end
end

分贝/迁移/ create_shops.rb

class CreateAddresses < ActiveRecord::Migration[5.1]
  def change
    create_table :addresses do |t|
      t.text :Address1
      t.text :Address2
      t.string :Postal
      t.string :Phone
      t.string :City

      t.timestamps
    end
  end
end

我想我没有这个...... 那么,如何在我的数据库中为商店添加地址?

谢谢。

1 个答案:

答案 0 :(得分:0)

我想在这里:

class CreateShops < ActiveRecord::Migration[5.1]
  has_many :addresses
  def self.up
    create_table :shops  do |t|
      t.string :shopify_domain, null: false
      t.string :shopify_token, null: false
      t.timestamps
    end

    add_index :shops, :shopify_domain, unique: true
  end

  def self.down
    drop_table :shops
  end
end

你不想要has_many :addresses。这个:

class CreateAddresses < ActiveRecord::Migration[5.1]
  def change
    create_table :addresses do |t|
      t.text :Address1
      t.text :Address2
      t.string :Postal
      t.string :Phone
      t.string :City

      t.timestamps
    end
  end
end

应该是这样的:

class CreateAddresses < ActiveRecord::Migration[5.1]
  def change
    create_table    :addresses do |t|
      t.references  :shop
      t.string      :address_1
      t.string      :address_2
      t.string      :postal
      t.string      :phone
      t.string      :city

      t.timestamps
    end
  end
end

正如@engineersmnky在评论中所提到的,从Rails 5开始,将在外键上自动创建索引。

对于未来可能不会使用Rails 5的读者(或者更晚,取决于您将来有多远),他们想要为外键添加索引......

如果您使用的是Rails 4.x,请执行以下操作:

class CreateAddresses < ActiveRecord::Migration
  def change
    create_table    :addresses do |t|
      t.references  :shop, index: true
      t.string      :address_1
      t.string      :address_2
      t.string      :postal
      t.string      :phone
      t.string      :city

      t.timestamps
    end
  end
end

如果您早于Rails 4.x,请参阅this question and answer