首页 > 解决方案 > Rails 中 SQLITE 列(数组)的问题

问题描述

我正在构建一个 API,我有 2 个模型UserCoin.

Coins表存储可以添加到用户帐户的默认硬币。

我需要将用户决定添加的硬币 ID 保存在User模型 ( my_coins) 的列中,并且只能列出用户保存的硬币。问题是我正在使用 sqlite3 并且无法将数组保存在列中

路由.rb

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

coin_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

标签: ruby-on-railsrubysqliterails-api

解决方案


正如@spickermann 上面所指出的,您似乎需要has and belongs to many associations (HBTM)在两个模型中都使用auserscoins,我认为这种方法更适合您的问题,使用这种方法很容易获取/更新/创建任何数据,至少我认为是比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

上面的例子是 on rails 5.2,通过上面的例子,你可以做类似的事情:

user1.coins << coin_a
user1.save

user1.coins然后,如果您想要与特定用户相关的所有硬币,您可以迭代(此链接可能会有所帮助)。

希望以上有所帮助!


推荐阅读