2014-02-27 78 views
0

我在为模型实现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 “恢复” SET “bio”=?,“updated_at”=? WHERE “resumes”。“id”= 20 [[“bio”,“This is my bio”],[“updated_at”,Thu, 2014年2月27日19:27:06 UTC +00:00]]

使用serialize方法,通过PinnyM的建议,

class Resume < ActiveRecord::Base 
    .... 
    serialize :skills 
end 

当我更新简历bio场,这是它的更新

SQL(0.2ms的)更新如何 “恢复” SET“bio”=?,“u pdated_at“=?, ”技能“=? WHERE“resumes”。“id”= 20 [[“bio”,“这是我的新生物”], [“updated_at”,Thu,2014年2月27日20:18:31 UTC +00:00],[技能”, “--- \正的Java \正ç\正红宝石\ n”](0.6ms)提交事务

注意skills是越来越重,即使我没有更新的区别对它做任何改变,而我的方法skills没有更新,因为我没有做任何改变。我想知道为什么在行为上的差异?有没有我可以通过serialize来阻止这种行为的选项?

+0

我希望,我可以帮你..; p –

+0

@ArupRakshit至少尝试。 Pinny的回答非常好,但我仍然有问题。 –

+0

我在Rails中很弱.. :( –

回答

2

使用serialize宏在你的简历模型,以帮助这一点:

serialize :skills, Array 

有了这个,你可以离开的技能参数设置为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数据。

+0

感谢您的答案。记录有无变化的技能每当技能得到更新(看到日志)时,我都会看到这种情况不会发生在我的方法中,通过我的方法,技能只会在我实际更新时更新,否则不会更新。为什么会这样?是否有任何我可以传递给'serialize'宏的选项来阻止这种行为? –

+0

@KirtiThorat:你有没有试过推荐的任何解决方案[here](http://stackoverflow.net M /问题/ 9981257 /停止ActiveRecord的节能-A-系列化列偶数如果 - 不改变)? – PinnyM

+0

为了记录,在Github的一个问题上有一个关于这个问题的讨论 - https://github.com/rails/rails/issues/8328,这里是一个解决这个问题的尝试性公关 - https://github.com/rails/rails/pull/13792 – PinnyM