【问题标题】:Checkbox implementation logic for a model模型的复选框实现逻辑
【发布时间】: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 typeArray 以便将技能直接存储在数据库中。

这是在数据库中存储复选框值的正确方法还是可以以更好的方式实现? 拆分和加入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


【解决方案1】:

在简历模型中使用 serialize 宏来帮助解决这个问题:

serialize :skills, Array

这样你可以将技能参数设置为一个数组,ActiveRecord 会为你执行序列化/反序列化。

至于执行的持续更新,这是我在下面提供的链接中讨论的一个持续问题。如果这种行为困扰您,我能看到的最简单的解决方法是@M.G.Palmer 的答案here 的变体。它的要点是将其分解为一个用于存储此数组的简单模型:

class Resume < AR::Base
  has_one :skill_store
  delegate :skills, to: :skill_store, allow_nil: true

class SkillStore < AR::Base
  belongs_to :resume
  serialize :skills, Array

由于此数据现在位于单独的表中,因此如果收集需要 skills 数据的简历组,请不要忘记预先加载。

【讨论】:

  • 感谢您的回答。那确实奏效了。但是我有一个问题,对于serialize,假设我更新了一条记录,无论是否更改技能,我都会看到每次技能都在更新(查看日志)。在我的方法中不会发生这种情况。使用我的方法,技能只有在我实际更新时才会更新,否则不会更新。为什么会这样?是否有任何选项可以传递给serialize 宏来阻止这种行为?
  • @KirtiThorat:您尝试过here推荐的任何解决方案吗?
  • 记录在案,在 Github 问题上正在讨论这个问题 - github.com/rails/rails/issues/8328,这里是一个暂定的 PR 来解决这个问题 - github.com/rails/rails/pull/13792
  • 感谢您的链接。我阅读了解决方案+讨论。创建一个新模型或为serialize 编写猴子补丁以使其正常工作以及显示带有静态数据的复选框是否有效?
  • @KirtiThorat:为此更新。我不推荐猴子补丁的方法,因为在实现中可能出错的东西太多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
相关资源
最近更新 更多