3

我有一个具有简单层次结构的 rails 3.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.clients,user.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

但是,如果您更喜欢有范围的想法,您应该将客户表加入您范围内的发票:

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