我有一个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),但这种模式是我的约束.... :(
答案 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