【发布时间】:2014-02-27 19:13:56
【问题描述】:
我在为模型实现 checkbox 逻辑时遇到问题。在模型Resume 中有一个名为skills 的字段,它通过checkboxes 接受多个值。
Resume 模型架构如下:
create_table :resumes do |t|
t.string :name, null: false
t.text :bio
t.string :skills
t.timestamps
end
在视图中,这里的复选框是我的代码:
<% skills = ["Ruby", "Perl", "Java", "C", "C++"] %>
<div class="form-group">
<% skills.each do |skill| %>
<%= check_box_tag "resume[skills][]", skill %> <%= skill %>
<% end %>
</div>
在控制器中:
def resume_params
params[:resume][:skills] = params[:resume][:skills].join(",")
params.require(:resume).permit(:name, :bio, :skills)
end
我得到了从表单返回的skills 数组。由于我已将skills 声明为数据库中的字符串类型,因此在将它们发送到数据库之前,我将在comma 上加入存储在数组中的检查值。我这样做的原因是因为我不知道data type 的Array 以便将技能直接存储在数据库中。
这是在数据库中存储复选框值的正确方法还是可以以更好的方式实现?
拆分和加入skills(复选框值)似乎是不必要的工作,只是为了在数据库中创建/更新。
编辑
使用我的方法(非序列化),当我更新简历中的bio 字段时,这就是它的更新方式
SQL (0.2ms) UPDATE "resumes" SET "bio" = ?, "updated_at" = ?在哪里 "resumes"."id" = 20 [["bio", "This is my bio"], ["updated_at", Thu, 2014 年 2 月 27 日 19:27:06 UTC +00:00]]
使用 PinnyM 建议的 serialize 方法,
class Resume < ActiveRecord::Base
....
serialize :skills
end
当我更新简历中的bio 字段时,它是这样更新的
SQL (0.2ms) UPDATE "resumes" SET "bio" = ?, "updated_at" = ?, “技能”=? WHERE "resumes"."id" = 20 [["bio", "This is my new bio"], [“updated_at”,2014 年 2 月 27 日星期四 20:18:31 UTC +00:00],[“技能”, "---\n- Java\n- C\n- Ruby\n"]] (0.6ms) 提交事务
请注意skills 再次更新的区别,即使我没有对其进行任何更改,而我的方法skills 没有更新,因为我没有对其进行任何更改。我想知道为什么行为上的差异?有什么选项可以传递给serialize 来阻止这种行为吗?
【问题讨论】:
-
我希望,我可以帮助你.. ;p
-
@ArupRakshit 至少尝试一下。 Pinny 的回答很好并且有效,但我仍然有一个问题。
-
我在 Rails 上很弱.. :(
-
为什么不使用 has_many belongs_to 关联制作技能模型...?
-
@RahulSingh 因为我不希望数据库开销用于存储和访问几乎不会改变的静态数据。我只会将它们用于复选框而不是其他地方。此外,复选框选项会很少(可能
标签: ruby-on-rails ruby checkbox ruby-on-rails-4