複数のモデルのサマリーを表示するダッシュボードが必要です。独自のデータなしで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
を書くとき
これはあまり意味がありません。 'id'とは何ですか?それは数字であるはずですか? ( '123()'を送ることはできません。それは有効なメソッド名ではありません) 'attr_accessor:user_id'で' Dashboard.user_id'を使うことはできません。クラスとクラスはインスタンスです。 ..あなたがこれがうまくいくと予想している例を明確にし、例を挙げてください。 –
こんにちはAndy、私は十分に明確ではないかもしれません。これは通常のActiveRecord :: Baseクラスではありません。したがって、current_userのidを保持する属性が必要です。 (私はこのIDを永久に保持したくない)。デリゲートによって、Dashboard.addressを呼び出してAccount.find_by_user_id(Dashboard.user_id).addressを返すことができます。この関数をAccountクラスに委任しようとしましたが、私はAccountにuser_idの値を何とか渡す必要があります。そのため、どのアカウントインスタンスを扱うべきか分かります。 – AdamNYC