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

时间:2011-05-28 15:18:06

标签: ruby-on-rails ruby properties associations override

我想覆盖关联的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

4 个答案:

答案 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