将虚拟属性组合到一个不从视图中保存的真实属性 - 活动记录

时间:2011-12-08 23:33:53

标签: ruby-on-rails activerecord

我正在使用虚拟属性在视图中打破逗号分隔的参数列表,然后尝试重新组合它们以保存到我的Active Record模型中。

鉴于真实属性“ad_columns”默认为“1,1,1,1”

我正在将它们分解为表单的各个属性:

attr_accessor :top_rows

#Getter
def top_rows
  split = ad_rows.split(',', 4)
  split[0]
end

#Setter
def top_rows=(trows)
  ad_rows_will_change!
  self.ad_rows = [trows, self.right_rows, self.bottom_rows, self.left_rows].join(",")
end

然后重复右,下,左,右。

如果我调用“object.top_rows”给定一个对象,我会得到“1”,如果我用irb更新它:

object.top_rows = "3"

然后它会正确更新ad_rows真实属性。我可以看到对象有变化,当我做

object.save

更改将在数据库中更新。

问题是,这不适用于视图。它不会保存到数据库中。我甚至使用logger.info来查看模型是否已更改,并且它将显示“ad_rows”确实已更改,但活动记录仍未更新真实属性。

我无法弄清楚为什么会这样。我只是做错了吗? :)谢谢。

为什么它会在irb中起作用而在视图中不起作用?

2 个答案:

答案 0 :(得分:0)

我首先要摆脱attr_accessor :tops_rows

该行为获取和设置实例变量@top_rows创建了额外且可能相互冲突的实例方法,并且不会触及ActiveRecord属性。

至于为什么它在视图中不起作用,我会检查您是否已在模型中添加:ad_rowsattr_accessible。这允许ActiveRecord在批处理操作中更改列(要更改多个属性)。 Documentation

答案 1 :(得分:0)

似乎由于属性:ad_rows未在参数中传递,因此控制器未将其识别为已更改。

我不得不补充道:

object.ad_rows_will_change!

到我的控制器强制它保存ad_rows列。

我不确定这是否是最好的解决方案,但它现在正在运作。