Нужна помощь в реализации отношений CRUD и Many_to_Many с приложением React / Rails - PullRequest
0 голосов
/ 26 мая 2019

Я создаю приложение с помощью карточки, используя комбинацию 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?
...