如何安全地覆盖rails中的save方法?

时间:2014-02-18 13:14:15

标签: ruby-on-rails activerecord

我有一个RoR应用程序(正在开发中)。我有基于sql视图的模型。

但是,我想创建&更新模型。它们通过2个表存储在数据库中(通用设计模式,这就是我使用sql视图的原因)。

我已经听说过诸如before_save之类的钩子,但如上所述[{3}},在before_save回调中仍然存在保存或更新其他对象的问题。

所以,我想知道如何安全地覆盖rails中的save方法?

欢迎任何建议。

由于

编辑:

我的观点的SQL

CREATE VIEW my_objects AS
SELECT o.* ,
at.value as "column1",
FROM
Generic_object o 
LEFT JOIN (SELECT at.* FROM Another_table at ON at.genreic_object_id = o.id AND at.name = "param1" )

这会导致重建"来自我的通用表的对象和另一个表中的一些列:

  

o.col1,o.col2,...,at.param1

如果我的对象有多个参数,我必须再次加入另一个表,比如

  

LEFT JOIN(SELECT at2。* FROM Another_table at2 ON at2.generic_object_id = o.id AND at2.name =" param2")

然后,我得到了这个对象:

  

o.col1,o.col2,...,at.param1,at2.param2

这似乎很少见(奇怪?:p),但这种模式是我的约束.... :(

2 个答案:

答案 0 :(得分:0)

根据我的经验,我很少发现需要覆盖常用方法。我不建议这样,因为将有其他代码取决于原始方法。你的问题必须有另一个更好的解决方案。

但是,如果您真的需要,可以通过Ruby的alias_method或ActivitySupport提供的alias_method_chain安全地覆盖它。

class Foo < ActiveRecord::Base
  alias_method_chain :save, :my_feature

  def save
    blah_blah
    save_without_my_feature # The original save method
  end
end

答案 1 :(得分:0)

def save
# new object ?
  # yes
  q = Array.new
  qualifiers.each  do |qk|
    q.push(Another_table.create(value: self.read_attribute(qk),name: qk))
  end
  e = Generic_object.create(name: name,type: self.class,qualifiers: q)

  # existing object 
  #bla bla
end