2011-09-24 10 views
12

複数のモデルのサマリーを表示するダッシュボードが必要です。独自のデータなしでPresenterを使用して実装しました。私は(データテーブルなし)ActiveModelクラスを使用します。Railsで代理メソッドに引数を渡す方法

class Dashboard 
    attr_accessor :user_id 
    def initialize(id) 
    self.user_id = id 
    end 

    delegate :username, :password, :to => :user 
    delegate :address, :to => :account 
    delegate :friends, :to => :friendship 

end 

委譲することで、私はDashboard.addressを呼び出し、バックAccount.find_by_user_id(Dashboard.user_id).addressを得ることができるようにしたいです。

ダッシュボードは、ActiveRecordのクラスだった場合、私はDashboard#belongs_to :accountを宣言している可能性があり、デリゲートは(つまり、アカウントには、ダッシュボードのインスタンスでto user_idに等しいuser_idを持つアカウントからアドレス属性を返す必要があります知っているだろう)、自動的に動作します。

しかし、DashboardはActiveRecordクラスではないため、belongs_toを宣言することはできません。 Accountに正しいレコードを検索させる別の方法が必要です。

この問題を解決する方法はありますか? (私は空のテーブルを持つためにDashboardを偽装することができますが、Userのインスタンスメソッドを引数を取るクラスメソッドに書き直すことはできますが、これらのソリューションはすべてハックです)。

ありがとうございます。あなたがdelegate :address, :to => :accountを書くとき

+0

これはあまり意味がありません。 'id'とは何ですか?それは数字であるはずですか? ( '123()'を送ることはできません。それは有効なメソッド名ではありません) 'attr_accessor:user_id'で' Dashboard.user_id'を使うことはできません。クラスとクラスはインスタンスです。 ..あなたがこれがうまくいくと予想している例を明確にし、例を挙げてください。 –

+0

こんにちはAndy、私は十分に明確ではないかもしれません。これは通常のActiveRecord :: Baseクラスではありません。したがって、current_userのidを保持する属性が必要です。 (私はこのIDを永久に保持したくない)。デリゲートによって、Dashboard.addressを呼び出してAccount.find_by_user_id(Dashboard.user_id).addressを返すことができます。この関数をAccountクラスに委任しようとしましたが、私はAccountにuser_idの値を何とか渡す必要があります。そのため、どのアカウントインスタンスを扱うべきか分かります。 – AdamNYC

答えて

10

が、これは基本的に同じオブジェクトのaccountメソッドを呼び出して、ダッシュボード上の新しいaddressメソッドを作成し、このaccount方法の結果にaddressを呼び出します。これは、(非常に大まか)書き込みに似ている:

class Dashboard 
    attr_accessor :user_id 
    def initialize(id) 
    self.user_id = id 
    end 

    delegate :username, :password, :to => :user 
    delegate :address, :to => :account 
    delegate :friends, :to => :friendship 

    def account 
    @account ||= Account.find_by_user_id(self.user_id) 
    end 
end 

この:あなたの現在のクラスで

class Dashboard 
... 
    def address 
    self.account.address 
    end 
... 
end 

、あなたがしなければならないすべては正しいuser_idを持つアカウントを返すaccountメソッドを作成することです

dashboard = Dashboard.new(1) 
# the following returns Account.find_by_user_id(1).address 
address = dashboard.address 
+0

Benoitありがとうございます。それはまさに私が探しているものです。 – AdamNYC

+0

@AdamNYC上記のコードについてご不明な点がございましたら、お気軽にお問い合わせください。私は喜んで追加の説明をします。 –

関連する問題