2012-01-24 16 views
1

少し混乱するものがあります。私はいくつかの問題を引き起こすので、少し明確にしてください。デリゲートを持つ仮想属性のself、self [:item]の相違点

私は、その都市の木の量を指定するwood_production属性への代理人を持つ都市モデルを持っています。私は通常、city.wood行うことができるようにしたかった

has_one :wood_production, :autosave => true 
delegate :amount, :to => :wood_production, :prefix => true, :allow_nil => true 

    def wood 
     wood_production_amount 
    end 

    def wood= amt 
     self[:wood_production_amount] = amt 
    end 

- = 1000、市を通じてその値を保存し、しかし、私はこれを所業あらゆる種類の問題に来ている:ようなものです。私の仮想属性を正しく設定していないようです。

だから私は実際にこれらの違いは何です、お願いしたいと思います:

def wood 
    self.wood_production_amount 
end 

def wood 
    wood_production_amount 
end 

def wood 
    self[:wood_production_amount] 
end 

と本当に正しく状況に対処するために何を使用する必要がありますか?

EDIT:

私が好きセッターを作成する場合:

def wood= amt 
    self.wood_production_amount = amt 
end 

私が手:

1.9.2p290 :003 > c.wood -= 1000 
=> 58195.895014789254 
1.9.2p290 :004 > c.save 
    (0.1ms) BEGIN 
    (0.3ms) UPDATE `wood_productions` SET `amount` = 58195.895014789254, `updated_at` = '2012-01-24 02:13:00' WHERE `wood_productions`.`id` = 1 
    (2.0ms) COMMIT 
=> true 

1.9.2p290 :005 > c.wood 
=> 66522.63434300483   ??????? 

BUFセッターがある場合:

最初に答える
def wood= amt 
    wood_production_amount = amt 
end 

1.9.2p290 :004 > c.wood -= 1000 
=> 58194.823000923556 
1.9.2p290 :005 > c.save 
    (0.1ms) BEGIN 
    (0.2ms) COMMIT 
=> true 

答えて

2

部分、self.wood_production_amountおよびwood_production_amountは機能的に同一である。唯一の違いは、後者では、自己が暗示され、Cityモデルの現在のインスタンスであることです。私はめったにself.anythingを必要としない限り使用しない。

self[:wood_production_amount]は、ほとんどの場合、最初の2つに機能的に類似あります。違いは、デフォルトのアクセサメソッドを簡単に上書きできることです。 read_attribute(:attribute)は、self[:attribute]と機能的に同一です。たとえば、Cityモデルにstate属性がありますが、要求されたときに常に大文字で状態を返したいとします。

class City < ActiveRecord::Base 
    def state 
    self[:state].try(:upcase) 
    # or 
    read_attribute(:state).try(:upcase) 
    end 
end 

city = City.new(:state => 'vermont') 
city.state # => VERMONT 

あなたの2番目の質問に答えるには、実際にどのように使いたいかによって決まります。個人的には、いくつかの動作を上書きする必要がない限り、デリゲートメソッドを使用します。しかし

delegate :amount, :amount= :to => :wood_production, 
     :prefix => true, :allow_nil => true 
+0

素敵な説明ありがとうを:)、でも委任セッターを設定した後、これは新しいを保存しません:それはあなたのために働いていなかった理由は、あなたにもsetterメソッド:amount=を委任されていないことかもしれません値:active_city.wood - = 1000 active_city.save(0.1ms)BEGIN (0.3ms)UPDATE 'cities' SET' updated_at' = '2012-01-24 02:08:57'都市' .'id' = 1 (44.1ms)COMMIT。なぜどんなアイデア?私の質問を説明するために編集する – Spyros

+0

あなたはsetterメソッド 'wood =(value)'を持っていますか? –

+0

はい、それは私の質問の最初のコード部分です。/ – Spyros

関連する問題