ruby-on-rails - Rails 中 SQLITE 列(数组)的问题
问题描述
我正在构建一个 API,我有 2 个模型User
和Coin
.
该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
解决方案
正如@spickermann 上面所指出的,您似乎需要has and belongs to many associations (HBTM)
在两个模型中都使用ausers
和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
上面的例子是 on rails 5.2
,通过上面的例子,你可以做类似的事情:
user1.coins << coin_a
user1.save
user1.coins
然后,如果您想要与特定用户相关的所有硬币,您可以迭代(此链接可能会有所帮助)。
希望以上有所帮助!
推荐阅读
- python - 查看包含您姓名的唯一字母的列表(不包含空格键)和包含出现次数等的列表
- html - 如何将圆形边框分为五个部分
- c++ - 为什么在包含 QStackedWidget-inherited 类后 Qt 不能构建我的项目?
- python - Python 在指定的 GMT 获取时间
- jenkins - 詹金斯计划的备份管道 - 确保所有作业在运行前停止
- linux - 如何加快 SMP 机器上的编译过程?
- windows - 如何使用 Powershell 将 curl 命令的结果通过管道传输到 tar?
- google-cloud-automl - 使用 AutoML 进行不同语言对的机器翻译
- android - 如何在运行时更新 Android BLE Advertiser 服务数据?
- json - ASPjson 中的嵌套数组