ActiveRecord `assign_to` для типов первичных ключей, отличных от целых - PullRequest
0 голосов
/ 01 мая 2018

Итак, у меня есть две модели, location и menu. У каждого location может быть много меню, но у каждого menu есть только одно location.

Я использую тип string для моих location идентификаторов. Однако я не могу получить rake db:migrate для генерации правильной схемы с типом string для внешнего ключа в таблице menu.

Модель:

class Location < ActiveRecord::Base
  self.primary_key = :id

  has_many :menus
end

class Menu < ActiveRecord::Base
  belongs_to :location
end

Миграция:

class CreateLocations < ActiveRecord::Migration[5.1]
  def change
    create_table :locations, id: false do |t|
      t.string :id, primary_key: true

      t.timestamps
    end
  end
end

class CreateMenus < ActiveRecord::Migration[5.1]
  def change
    create_table :menus do |t|
      t.belongs_to :location
      # other stuff
    end
  end
end

результат в этой схеме

ActiveRecord::Schema.define(version: 20180413142949) do
  create_table "locations", primary_key: "id", id: :string, force: :cascade do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
    create_table "menus", force: :cascade do |t|
    t.bigint "location_id"
    t.text "name", null: false
    # other stuff
    t.index ["location_id"], name: "index_menus_on_location_id"
  end
end

Так что я тут не так делаю?

1 Ответ

0 голосов
/ 01 мая 2018

Похоже, вам нужно изменить миграцию для таблицы menus. Вы пробовали что-то подобное?

t.references :locations, type: :string, index: true

Или:

class CreateMenus < ActiveRecord::Migration[5.1]
  def change
    create_table :menus
    add_reference(:menus, :location, type: :string, foreign_key: true)
  end
end
...