我有一个简单的层次结构的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添加到发票中。
答案 0 :(得分:2)
正如@gregates在评论中所说,最好为用户,客户端和用户定义关联。发票模型然后使用user.clients
,user.invoices
,invoice.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