Rails 中 SQLITE 列(数组)的问题
Problems with SQLITE columns (array) in Rails
我正在构建一个 API,我有 2 个模型 User
和 Coin
。
Coins
table 存储可以添加到用户帐户的默认硬币。
我需要在 User
模型 (my_coins
) 的列中保存用户决定添加的硬币 ID,并且能够仅列出用户保存的硬币。
问题是我使用的是 sqlite3,我无法在列中保存数组
Routes.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
coins_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 所指出的,似乎您需要的是 users
和 coins
这两个模型中的 has and belongs to many associations (HBTM)
,我认为这种方法更适合您的问题, 使用这种方法很容易 get/update/create 任何数据,至少我认为比 users
table 列中的数组更好,以防您想在这里尝试一下我会怎么做:
因此,在您的 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
如果您想要与特定用户 (This link might be helpful) 相关的所有代币,那么您可以迭代 user1.coins
。
希望以上内容对您有所帮助!
我正在构建一个 API,我有 2 个模型 User
和 Coin
。
Coins
table 存储可以添加到用户帐户的默认硬币。
我需要在 User
模型 (my_coins
) 的列中保存用户决定添加的硬币 ID,并且能够仅列出用户保存的硬币。
问题是我使用的是 sqlite3,我无法在列中保存数组
Routes.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
coins_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 所指出的,似乎您需要的是 users
和 coins
这两个模型中的 has and belongs to many associations (HBTM)
,我认为这种方法更适合您的问题, 使用这种方法很容易 get/update/create 任何数据,至少我认为比 users
table 列中的数组更好,以防您想在这里尝试一下我会怎么做:
因此,在您的 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
如果您想要与特定用户 (This link might be helpful) 相关的所有代币,那么您可以迭代 user1.coins
。
希望以上内容对您有所帮助!