Ruby на иностранных ключах Rails - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь понять, как использовать внешние ключи в Rails,

$ rails g scaffold categories cat:string value:integer
$ rails db:migrate

Затем создайте новую таблицу с внешним ключом, соединяющимся с первыми категориями таблиц,

$ rails g scaffold subcategories subcats:string subcatsvalue:integer categories:references 
$ rails db:migrate

Затем я добавляю / category к URL, и форма там, как и ожидалось, и я могу делать все операции CRUD.

Затем я добавляю / подкатегории к URL и пытаюсь добавить некоторые данные в форму, такие как as,

Subcats: blah Subcatsvalue: 123 Categories: cat1

это должен быть идентификатор категории или название категории?

/ RubyLearningApp / db / migrate /20200413195730_create_categories.rb

class CreateCategories < ActiveRecord::Migration[5.0]
  def change
    create_table :categories do |t|
      t.string :cat
      t.integer :value

      t.timestamps
    end
  end
end

/ RubyLearningApp / db / migrate / 20200413200303_create_subcategories.rb

class CreateSubcategories < ActiveRecord::Migration[5.0]
  def change
    create_table :subcategories do |t|
      t.string :subcats
      t.integer :subcatsvalue
      t.references :categories, foreign_key: true

      t.timestamps
    end
  end
end

Это правильный способ установки внешнего ключа между таблицами?

* Когда я заполняю категории с помощью 'cat1', я получаю следующую ошибку:

enter image description here

Schema.rb

ActiveRecord::Schema.define(version: 20200413200303) do

  create_table "categories", force: :cascade do |t|
    t.string   "cat"
    t.integer  "value"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "subcategories", force: :cascade do |t|
    t.string   "subcats"
    t.integer  "subcatsvalue"
    t.integer  "categories_id"
    t.datetime "created_at",    null: false
    t.datetime "updated_at",    null: false
    t.index ["categories_id"], name: "index_subcategories_on_categories_id"
  end

end

Файлы модели:

category.rb

class Category < ApplicationRecord
end

subcatego ry.rb

class Subcategory < ApplicationRecord
  belongs_to :categories
end

Любая помощь будет принята с благодарностью,

Спасибо,

1 Ответ

1 голос
/ 14 апреля 2020

Есть несколько проблем с вашими лесами, которые могут вызывать проблемы. Правильный способ создания скаффолда - это использование имени скаффолда в единственном числе:

rails g scaffold Category

и

rails g scaffold SubCategory

Это позволит использовать Rails, встроенный в Inflector, для множественного числа имен, где это необходимо.

При использовании ссылок вы также должны использовать единственное число:

category:references

Это Rails Way, и оно решит большинство проблем, с которыми вы столкнулись. Другая проблема заключается в том, что если вы хотите добавить категорию в URL, вы должны вложить свои маршруты:

resources :categories do
  resources :sub_categories
end

Это позволит вам использовать маршруты типа

http://localhost:3000/categories/1/subcategories

и

http://localhost:3000/categories/1/subcategories/1

Первый номер (ближайший слева) - это идентификатор категории, доступ к которому можно получить с помощью params[:category_id] в файле sub_categories_controller.rb. Второй номер (ближайший справа) является идентификатором sub_category и может быть доступен с помощью params[:id] в файле sub_categories_controller.rb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...