ruby-on-rails – 为什么Rails模型属性不能使用符号而不是字符串
发布时间:2020-12-17 04:05:27 所属栏目:百科 来源:网络整理
导读:我需要在数据库更新之前和之后比较一些Rails(2.3.11)模型属性值,所以我首先找到我的记录并将现有属性值保存在哈希中,如下所示: id = params[:id]work_effort = WorkEffort.find(id)ancestor_rollup_fields = { :scheduled_completion_date = work_effort.sc
我需要在数据库更新之前和之后比较一些Rails(2.3.11)模型属性值,所以我首先找到我的记录并将现有属性值保存在哈希中,如下所示:
id = params[:id] work_effort = WorkEffort.find(id) ancestor_rollup_fields = { :scheduled_completion_date => work_effort.scheduled_completion_date } work_effort.update_attributes(params.except(:controller,:action)) #etcetera 注意我坚持使用符号作为哈希键的“最佳实践”. 然后我有一个方法,如果哈希值和模型属性中的值不匹配,则采用模型和哈希来确定可能采取的其他步骤.为了确定这一点,我尝试在每个循环中获取模型属性值,但我最初得到的是: def rollup_ancestor_updates(work_effort,ancestor_rollup_fields) ancestor_rollup_fields.each do |key,value| model_val = work_effort.attributes[key] #nil #etcetera 在上面的调试中,我注意到将字符串硬编码为键: work_effort.attribute['scheduled_completion_date'] 返回所需的值.那么在我的每个块中我尝试了以下它并且它有效: model_val = work_effort.attributes[key.to_s] 有没有不同的方法来做到这一点?对我来说,仅仅3个月的Ruby / Rails经验,使用符号作为散列键就像规定的最佳实践一样令人困惑,但是必须在符号上调用.to_s才能获得模型属性.有没有其他人经历过这个,解决过这个,也被这个混淆了?提前致谢 解决方法
当您在AR实例上调用#attributes时返回的哈希具有字符串键,这就是为什么作为哈希索引的符号在您的情况下不起作用的原因. Hash的子类名为HashWithIndifferentAccess,它自动将符号索引转换为字符串.
经常在Rails中你会遇到HashWithIndifferentAccess实例.一个完美的例子是您在控制器和视图代码中访问的params变量. 尝试使用work_effort.attributes.with_indifferent_access [key] 真的,它只是做同样的事情,但它在幕后做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |