对于Rails中的关联,write_attribute的等价物是什么?

Fir*_*lem 7 ruby overriding properties ruby-on-rails associations

我想覆盖关联的setter,但write_attribute()不起作用 - 可能是因为该方法仅适用于数据库列.

我已经尝试过super(),但这也不起作用(不认为它会...但值得一猜).

如何覆盖setter?这是我想要做的:

  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
Run Code Online (Sandbox Code Playgroud)

Lef*_*dis 11

对我有用的是:

def parent=(new_parent)
  # do stuff before setting the new parent...

  association(:parent).writer(new_parent)
end
Run Code Online (Sandbox Code Playgroud)


Fir*_*lem 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
Run Code Online (Sandbox Code Playgroud)

我不一定喜欢 Rails 的一件事是,每当你想做一些有点超出常规的事情时 - 但无论如何也不是不合理 - “如何”与你的直觉会非常不同。

当你知道例外情况时,这不是问题,但当你学习时,这种做事方式的不规则性和不一致会使学习变得更困难,而不是更容易。

Java 最初可能更难学,但它更加一致。一旦您用 Java 进行思考,您的直觉就会带您走得更远。一旦你在 Rails 中思考,情况就不是这样了。Rails 是关于记忆调用方法和记忆如何做事的。在java中,你可以推理出更多的东西......而智能感知会填补剩下的部分。

我只是很失望。这对我来说是一个反复出现的模式 - 我想做一些比框架示例“稍微复杂一点”的事情......并且“如何”不一致,需要 30 分钟甚至可能几个小时才能找到并找到答案它。