访问范围内的父级

时间:2013-02-15 20:39:58

标签: ruby-on-rails scope associations rails-activerecord

我有一个简单的层次结构的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添加到发票中。

1 个答案:

答案 0 :(得分:2)

正如@gregates在评论中所说,最好为用户,客户端和用户定义关联。发票模型然后使用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

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

class Invoice < ActiveRecord::Base
  ...
  scope :by_user, lambda { |user| joins(:client).where("clients.user_id = ?", user.id) }
  ...
end