Я создаю приложение с помощью карточки, используя комбинацию React / Rails-api. Приложение позволяет пользователю создавать колоду, создавать карты и назначать их в колоду. Это началось как a deck has_many cards
и cards belongs_to deck
. Это проблематично, потому что если я удаляю колоду, карта имеет потерянный deck_id в качестве атрибута. Я также хотел, чтобы у пользователя была возможность выбора из существующих карт при создании. Когда пользователь создает карту, он должен назначить колоду.
Итак, я изменил соотношение между card
и decks
на many_to_many
с таблицей соединений deck_cards
. Я могу найти свои отношения между колодой и картой с Deck.first.cards
и Card.first.decks.
Мой главный вопрос: как мне обработать действие CRUD для этого типа отношений в React с запросами на выборку? Вот пример моего текущего запроса на выборку для создания новой колоды:
createDeck = (deckName) => {
console.log(deckName)
fetch('http://localhost:9000/api/v1/decks', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: JSON.stringify({
name: deckName,
user_id: '1'
})
})
.then(res => res.json())
.then(newDeck => {
if (newDeck.errors) {
alert(newDeck.errors)
} else {
this.setState({ decks: [...this.state.decks, newDeck]})
}
});
};
Вот моя схема Rails / ActiveRecord:
ActiveRecord::Schema.define(version: 2019_05_25_235607) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
create_table "cards", force: :cascade do |t|
t.string "front"
t.string "back"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "deck_cards", id: false, force: :cascade do |t|
t.integer "deck_id"
t.integer "card_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "decks", force: :cascade do |t|
t.string "name"
t.integer "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "users", force: :cascade do |t|
t.string "username"
t.string "password"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
Мои модели:
class Card < ApplicationRecord
has_many :deck_cards, dependent: :destroy
has_many :decks, through: :deck_cards
end
class Deck < ApplicationRecord
has_many :deck_cards, dependent: :destroy
has_many :cards, through: :deck_cards
belongs_to :user
end
class DeckCard < ApplicationRecord
belongs_to :deck
belongs_to :card
end
class User < ApplicationRecord
has_many :decks
end
Being a noob, my brain has turned to mush trying to understand how to keep single source of truth so that Cards are not dependent on Decks and vice versa. How do I do CRUD action on the cards, decks and join table from React fetch CRUD requests?