3

階層が簡単なRails3.2アプリケーションがあります。ユーザーには多くのクライアントがあり、クライアントには多くの請求書があります。

とを実行することにより、ユーザーがスコープを使用して自分のクライアントと請求書のみを表示できるようにしClient.by_user(current_user)ますInvoice.by_user(current_user)。クライアントの場合、これは正常に機能します。

scope :by_user, lambda { |user| where(user_id: user.id) }

ただし、請求書についても同じことを試してみると

scope :by_user, lambda { |user| where(client.user_id => user.id) }

それは失敗し、私に言ったundefined local variable or method 'client'

私は何が間違っているのですか?請求書にuser_idsを追加したくありません。

4

1 に答える 1

2

@gregates がコメントで述べたように、User、Client、および Invoice モデルの関連付けを定義してからuser.clientsuser.invoicesinvoice.userなどを使用することをお勧めします。

class User < ActiveRecord::Base
  has_many :clients
  has_many :invoices, through: :clients
end

class Client < ActiveRecord::Base
  belongs_to :user
  has_many :invoices
end

class Invoice < ActiveRecord::Base
  belongs_to :client
  has_one :user, through: :client
end

ただし、スコープのあるアイデアを好む場合は、clients テーブルをスコープ内の請求書に結合する必要があります。

class Invoice < ActiveRecord::Base
  ...
  scope :by_user, lambda { |user| joins(:client).where("clients.user_id = ?", user.id) }
  ...
end
于 2013-02-15T21:00:10.297 に答える