我正在尝试覆盖rails应用和id对关联对象的方式,例如:
有两个简单的模型:
class Album < ActiveRecord::Base
has_many :photos
end
class Photo < ActiveRecord::Base
belongs_to :album
end
然后我想这样做:
album = Album.new :title => 'First Album'
album.photos.build
album.save #=> true
在这种情况下,我创建了一个覆盖id属性并将其替换为散列字符串的插件,所以我想要做的是找到替换为我的自定义方法替换album_id
的方法的int和能够在保存之前转换。
但是我想在Rails结构中全局行动,因为它是一种插件,我想让这个动作在动态模型上工作,这就是为什么我不能在模型上创建before_save
验证。
我不确定它是否易于理解,但我希望有人可以帮助我......
以下是我当前表格的截图,以便您了解正在发生的事情:
SQLite3 DB http://cl.ly/1j3U/content
因为你可以看到album_id
它被保存时我的自定义ruby对象被替换了...我已经禁用了插件然后它正常保存了11和12的记录......
我希望只使用rails操作并使用我的自定义方法进行转换,例如
def rails_association_replaced_method(record)
#take the record associations and apply a to_i custom method before save
super(record)
end
这样的事情:)
嗯,我希望这不会太复杂
干杯
答案 0 :(得分:1)
似乎我只覆盖了ActiveRecord :: Base保存方法,如果处理得当,可以完成这项工作
define_method 'save' do
int_fields = self.class.columns.find_all { |column| column.type == :integer }
int_fields.each do |field|
if self.attributes[field.name]
self.attributes[field.name] = self.attributes[field.name].to_i
end
end
super
end
这将替换当前模型中对结果应用to_i方法的所有整数字段。
答案 1 :(得分:0)
Rails对默认值的这种更改不友好。你的最终目标是什么?