Скорее всего, вы слишком много думаете и усложняете проблему. Придерживайтесь идиомы AR - используйте единственный первичный ключ с именем id
.
Для таблиц соединения используйте внешние ключи вместо составных PK. Также придерживайтесь соглашения об именах, если вы не хотите выглядеть неумелым или раздражать других разработчиков, нарушая принцип наименьшего удивления. Это означает:
- используйте
snake_case
для всего (имена таблиц, столбцы, имена индексов и т. д.)
- не ставьте перед столбцом имя таблицы. Это просто увеличивает длину каждой переменной в вашем приложении и не требуется в ORM.
- используйте
_id
для столбцов внешнего ключа. бывший; parent_id
- используйте
_at
для отметок времени. бывший; confirmed_at
- используйте
thing_other_things
для объединяемых таблиц, если нет более описательного имени
Также во многих из этих случаев следует просто использовать косвенное отношение для присоединения к иерархии вместо дублирования внешних ключей.
Это пример схемы БД:
ActiveRecord::Schema.define(version: 20161214013752) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
create_table "ingredient_types", force: :cascade do |t|
t.string "name"
t.string "description"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "ingredients", force: :cascade do |t|
t.integer "ingredient_type_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["ingredient_type_id"], name: "index_ingredients_on_ingredient_type_id", using: :btree
end
create_table "recipe_ingredients", force: :cascade do |t|
t.integer "recipe_id"
t.integer "ingredient_id"
t.float "quantity"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["ingredient_id"], name: "index_recipe_ingredients_on_ingredient_id", using: :btree
t.index ["recipe_id"], name: "index_recipe_ingredients_on_recipe_id", using: :btree
end
create_table "steps", force: :cascade do |t|
t.integer "recipe_id"
t.integer "ordinal"
t.text "instruction"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["recipe_id"], name: "index_steps_on_recipe_id", using: :btree
end
create_table "recipes", force: :cascade do |t|
t.string "name"
t.string "description"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_foreign_key "ingredients", "ingredient_types"
add_foreign_key "recipe_ingredients", "ingredients"
add_foreign_key "recipe_ingredients", "recipes"
add_foreign_key "steps", "recipes"
end
class IngredientType < ApplicationRecord
has_many :ingredients
end
class Ingredient < ApplicationRecord
belongs_to :ingredient_type
has_many :recipe_ingredients
has_many :recipes, through: :recipe_ingredients
end
class RecipeIngredient < ApplicationRecord
belongs_to :recipe
belongs_to :ingredient
has_one :ingredient_type, through: :ingredient
end
class Step < ApplicationRecord
belongs_to :recipe
end
class Recipe < ApplicationRecord
has_many :recipe_ingredients
has_many :ingredients, through: :recipe_ingredients
has_many :steps
end
14.12.2016
recipes
иingredients
? 14.12.2016mix half the four with the eggs
в шагах. ЦЕЛОВАТЬ. 14.12.2016