Ruby on Rails - 覆盖关联ID创建过程

时间:2010-07-21 21:39:51

标签: ruby-on-rails activerecord save override associations

我正在尝试覆盖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

这样的事情:)

嗯,我希望这不会太复杂

干杯

2 个答案:

答案 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对默认值的这种更改不友好。你的最终目标是什么?