如何将所选值从一个 table 列保存到另一个 table 列
How to save selected values from one table column to another table column
我是 Rails 的新手,正在努力学习。在我的简单表单中,我创建了一个下拉菜单 select,其中包含来自 table 的名为 professionals 的生成数据。这部分工作正常,我可以 select 多个值。我正在使用 mysql 数据库。
当我单击提交按钮时,我需要它将所选值保存到另一个名为 users 的 table 中名为 my_professions 的列中。我不知道该怎么做。
我得到这个错误
我的表格
<%= simple_form_for @user, url: wizard_path, method: :put do |f| %>
<%= collection_select(:f, :professions_id, Profession.where.not(name: nil), :id, :name, {:multiple => true}, {:class=>'js-example-basic-multiple', :id=>'jsmultipleddd'}) %>
<%= f.submit "Save", :class => 'btn blue' %>
<% end %>
我已经尝试将其添加到用户模型中
user.rb
class User < ApplicationRecord
has_many :professions
accepts_nested_attributes_for :professions
serialize :my_professions, Array
end
还有这个职业模特
profession.rb
class Profession < ApplicationRecord
belongs_to :user
end
我的参数看起来像这样
registration_steps_controller.rb
def user_params
params.require(:user).permit(:gender,:practitioner_website, :public_health_insurance, clinic_images: [], professions: [])
end
application_controller.rb
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:gender, :practitioner_website, :public_health_insurance, clinic_images: [], professions: []])
devise_parameter_sanitizer.permit(:account_update, keys: [:gender, :practitioner_website, :public_health_insurance, clinic_images: [], professions: []])
end
从删除 accepts_nested_attributes_for :professions
开始。您不需要为此嵌套属性。
然后干掉serialize :my_professions, Array
。 Serialize 是一种将复杂数据存储在字符串列中的传统技巧。你不需要或不想要这个(永远),因为关联应该存储在 ActiveRecord 的连接表中——而不是数组列。这就是 AR 的设计方式,也是关系数据库的设计方式。
相反,您想要的是一个连接模型。您可以使用以下方式生成:
rails g model user_profession user:belongs_to profession:belongs_to
运行迁移。然后您在用户和专业之间设置 the associations:
class User < ApplicationRecord
# ...
has_many :user_professions
has_many :professions, through: :user_professions
end
class Profession < ApplicationRecord
# ...
has_many :user_professions
has_many :users, through: :user_professions
end
现在这让我们可以通过 profession_ids
.
将用户与职业联系起来
在正常的 Rails 表单中,您将创建输入:
<%= f.collection_select :profession_ids, Profession.all, :id, :name, multiple: true ... %>
在 SimpleForm 中使用 the association 助手:
<%= f.association :professions, ... %>
然后将正确的参数列入白名单:
def user_params
# don't jam this into one super long unreadable line
params.require(:user)
.permit(
:gender, :practitioner_website, :public_health_insurance,
clinic_images: [], profession_ids: []
)
end
我是 Rails 的新手,正在努力学习。在我的简单表单中,我创建了一个下拉菜单 select,其中包含来自 table 的名为 professionals 的生成数据。这部分工作正常,我可以 select 多个值。我正在使用 mysql 数据库。
当我单击提交按钮时,我需要它将所选值保存到另一个名为 users 的 table 中名为 my_professions 的列中。我不知道该怎么做。 我得到这个错误
我的表格
<%= simple_form_for @user, url: wizard_path, method: :put do |f| %>
<%= collection_select(:f, :professions_id, Profession.where.not(name: nil), :id, :name, {:multiple => true}, {:class=>'js-example-basic-multiple', :id=>'jsmultipleddd'}) %>
<%= f.submit "Save", :class => 'btn blue' %>
<% end %>
我已经尝试将其添加到用户模型中
user.rb
class User < ApplicationRecord
has_many :professions
accepts_nested_attributes_for :professions
serialize :my_professions, Array
end
还有这个职业模特
profession.rb
class Profession < ApplicationRecord
belongs_to :user
end
我的参数看起来像这样
registration_steps_controller.rb
def user_params
params.require(:user).permit(:gender,:practitioner_website, :public_health_insurance, clinic_images: [], professions: [])
end
application_controller.rb
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:gender, :practitioner_website, :public_health_insurance, clinic_images: [], professions: []])
devise_parameter_sanitizer.permit(:account_update, keys: [:gender, :practitioner_website, :public_health_insurance, clinic_images: [], professions: []])
end
从删除 accepts_nested_attributes_for :professions
开始。您不需要为此嵌套属性。
然后干掉serialize :my_professions, Array
。 Serialize 是一种将复杂数据存储在字符串列中的传统技巧。你不需要或不想要这个(永远),因为关联应该存储在 ActiveRecord 的连接表中——而不是数组列。这就是 AR 的设计方式,也是关系数据库的设计方式。
相反,您想要的是一个连接模型。您可以使用以下方式生成:
rails g model user_profession user:belongs_to profession:belongs_to
运行迁移。然后您在用户和专业之间设置 the associations:
class User < ApplicationRecord
# ...
has_many :user_professions
has_many :professions, through: :user_professions
end
class Profession < ApplicationRecord
# ...
has_many :user_professions
has_many :users, through: :user_professions
end
现在这让我们可以通过 profession_ids
.
在正常的 Rails 表单中,您将创建输入:
<%= f.collection_select :profession_ids, Profession.all, :id, :name, multiple: true ... %>
在 SimpleForm 中使用 the association 助手:
<%= f.association :professions, ... %>
然后将正确的参数列入白名单:
def user_params
# don't jam this into one super long unreadable line
params.require(:user)
.permit(
:gender, :practitioner_website, :public_health_insurance,
clinic_images: [], profession_ids: []
)
end