Я создаю 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





Как указано выше @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, если хотите, чтобы все монеты были связаны с конкретным пользователем (Эта ссылка может быть полезной).
Надеюсь, вышеизложенное поможет 👍!
Возможно, я неправильно понял ваш вопрос, но для меня это звучит как идеальный пример ассоциации has_and_belongs_to_many между пользователями и монетами. И в этом случае вы будете использовать таблицу соединения
coins_usersвместо столбца массива для пользователей.