2011-05-28 72 views
6

我想重寫關聯的setter,但write_attribute()不起作用 - 可能是因爲該方法僅適用於數據庫列。Rails中關聯的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 

回答

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分鐘甚至幾小時才能找到並找到答案它。

0

而不是

def parent=(value) 
    write_attribute(:parent, value) 
end 

你不能只是做:

def parent=(parent) 
    parent_id = parent.id 
end 
11

什麼工作對我來說是這樣的:

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

    association(:parent).writer(new_parent) 
end 
3

在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