我想覆盖关联的setter,但write_attribute()不起作用 - 可能是因为该方法仅适用于数据库列。
我已经尝试过super(),但这也不起作用(不认为它会......但值得一猜)。
如何覆盖设定者?这是我想要做的:
def parent=(value)
# this line needs to be changed
write_attribute(:parent, value)
if value.subject.start_with?('Re:')
self.subject = "#{value.subject}"
else
self.subject = "Re: #{value.subject}"
end
self.receivers << value.sender
end
答案 0 :(得分:11)
对我有用的是:
def parent=(new_parent)
# do stuff before setting the new parent...
association(:parent).writer(new_parent)
end
答案 1 :(得分:3)
我找到了一种方法,但我对它感到不安:
alias_method :old_parent=, :parent=
def parent=(value)
self.old_parent = value
if value.subject.start_with?('Re:')
self.subject = "#{value.subject}"
else
self.subject = "Re: #{value.subject}"
end
self.receivers << value.sender
end
我不一定喜欢Rails的一件事是,无论什么时候你想做一些超出常规的事情 - 但不是任何方式都不合理 - “如何”与你的直觉会有什么不同想出来。
当你知道异常时,这不是问题,但是当你正在学习时,这种不规则性和如何做事情的不一致使得学习变得更加困难 - 而不是更容易。
Java可能最初难以学习,但它更加一致。一旦你在Java中思考,你的直觉可以带你进一步发展。一旦你在Rails中思考,这就不是真的。 Rails是关于记忆调用和记忆如何做事的方法。在java中,你可以推理出更多...而intellisense将填补其余部分。
我很失望。这对我来说是一个反复出现的模式 - 我想要做一些比框架示例“更复杂”的事情......并且“如何”是不一致的,需要30分钟甚至几个小时来找到并找到答案它
答案 2 :(得分:2)
在Rails 4.2.1 doc:
中# Association methods are generated in a module that is included into the model class,
# which allows you to easily override with your own methods and call the original
# generated method with +super+. For example:
#
# class Car < ActiveRecord::Base
# belongs_to :owner
# belongs_to :old_owner
# def owner=(new_owner)
# self.old_owner = self.owner
# super
# end
# end
答案 3 :(得分:0)
而不是
def parent=(value)
write_attribute(:parent, value)
end
你不能这样做:
def parent=(parent)
parent_id = parent.id
end