Проблемы со столбцами SQLITE (массивом) в Rails

Я создаю API, у меня есть 2 модели User и Coin.

В таблице Coins хранятся монеты по умолчанию, которые можно добавить в аккаунт пользователя.

Мне нужно сохранить идентификаторы монет, которые пользователь решил добавить в столбец модели User (my_coins), и иметь возможность перечислять только монеты, сохраненные пользователем. Проблема в том, что я использую sqlite3 и не могу сохранить массив в столбце

Маршруты.рб

get '/getCoins', to: "coins#index"
post '/coin/add', to: "users#add_coin"

users_controller.rb

class Api::V1::UsersController < ApplicationController
    before_action :validate_jwt # Validates JWT, @current_user
    before_action :user_coins_params

    def add_coin
        coin_acronym = user_coins_params[:id]
        if Coin.find(coin_acronym).exists?

            # @current_user CURRENT USER LOGGED IN ACTIVE RECORD
            # ADD THE ID OF COIN TO MY_COINS COLUMN            

            if # push id of coin to my_coins column success 
                render json: { success: true, message: "Moeda cadastrada com sucesso!" }
            else 
                render json: { success: false, errors: @current_user.errors }
            end
        else
            render json: { success: false, message: "Moeda não encontrada" }
        end
    end

    private
        def user_coins_params
            ActiveModelSerializers::Deserialization.jsonapi_parse!(params)
        end
end

монеты_controller.rb

class Api::V1::CoinsController < ApplicationController
  before_action :validate_jwt # VALIDATES JWT, @current_user
  before_action :set_coin, only: [:show, :update, :destroy]

  # /coins GET USER COINS 
  def index    
    @coins = # GET USER COINS (@current_user.my_coins.each { |coinId| ... })
    render json: @coins, include: [:mining_type]
  end

end

Возможно, я неправильно понял ваш вопрос, но для меня это звучит как идеальный пример ассоциации has_and_belongs_to_many между пользователями и монетами. И в этом случае вы будете использовать таблицу соединения coins_users вместо столбца массива для пользователей.

spickermann 25.12.2020 20:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указано выше @spickermann, кажется, что вам нужен has and belongs to many associations (HBTM) в обеих моделях users и coins, я думаю, что этот подход лучше подходит для вашей проблемы, легко получить/обновить/создать любые данные с помощью этого подхода, по крайней мере Я думаю, что это лучше, чем массив внутри столбца вашей таблицы users, если вы хотите попробовать, вот как я это сделаю:

Итак, на вашей модели coin добавьте следующую строку: has_and_belongs_to_many :users; а в вашей user модели: has_and_belongs_to_many :coins.

После того, как вы добавили правильные ассоциации в свои модели, вам нужно сгенерировать migration, чтобы создать свой join table, код миграции должен выглядеть следующим образом:

create_join_table :users, :coins do |t|
      t.index [:user_id, :coin_id]
      t.index [:coin_id, :user_id]
end

Пример выше находится на rails 5.2, и с ним вы можете делать такие вещи, как:

user1.coins << coin_a
user1.save

Затем вы можете перебрать user1.coins, если хотите, чтобы все монеты были связаны с конкретным пользователем (Эта ссылка может быть полезной).

Надеюсь, вышеизложенное поможет 👍!

Другие вопросы по теме