15

複数のモデルの概要を表示するダッシュボードが必要で、独自のデータなしで Presenter を使用して実装しました。ActiveModel クラスを使用します (データ テーブルなし):

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

Dashboard が ActiveRecord クラスである場合、宣言するとデリゲートが自動的に機能します (つまり、Account は、Dashboard インスタンスに等しいDashboard#belongs_to :accountアカウントからアドレス属性を返す必要があることを認識します)。user_idto user_id

しかし、Dashboard は ActiveRecord クラスではないため、宣言できませんbelongs_to。アカウントに正しいレコードを検索するように指示する別の方法が必要です。

この問題を克服する方法はありますか? (Dashboard を空のテーブルに偽装したり、User のインスタンス メソッドを引数を取るクラス メソッドに書き換えたりできることはわかっています。しかし、これらの解決策はすべて裏技です)。

ありがとうございました。

4

1 に答える 1

13

を記述するdelegate :address, :to => :accountと、ダッシュボードに新しいaddressメソッドが作成されます。このメソッドは、基本的accountに同じオブジェクトのメソッドを呼び出しaddressてから、このメソッドの結果を呼び出しますaccount。これは(非常に大まかに)書くことに似ています:

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

現在のクラスではaccount、正しいアカウントを返すメソッドを作成するだけですuser_id:

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

これにより、次のようにアドレスにアクセスできます。

dashboard = Dashboard.new(1)
# the following returns Account.find_by_user_id(1).address
address = dashboard.address
于 2011-09-24T14:22:54.230 に答える