Ruby on rails 访问作用域中的父对象
我有一个rails 3.2应用程序,具有简单的层次结构:一个用户有许多客户端,一个客户端有许多发票 我希望用户只通过执行Ruby on rails 访问作用域中的父对象,ruby-on-rails,scope,associations,rails-activerecord,Ruby On Rails,Scope,Associations,Rails Activerecord,我有一个rails 3.2应用程序,具有简单的层次结构:一个用户有许多客户端,一个客户端有许多发票 我希望用户只通过执行Client.by\u user(当前用户)和Invoice.by\u user(当前用户)操作,使用作用域查看自己的客户机和发票。对于客户,我有一个很好的方法: scope :by_user, lambda { |user| where(user_id: user.id) } 但是,如果我尝试同样的发票 scope :by_user, lambda { |user| whe
Client.by\u user(当前用户)
和Invoice.by\u user(当前用户)
操作,使用作用域查看自己的客户机和发票。对于客户,我有一个很好的方法:
scope :by_user, lambda { |user| where(user_id: user.id) }
但是,如果我尝试同样的发票
scope :by_user, lambda { |user| where(client.user_id => user.id) }
它失败了,告诉我未定义的局部变量或方法“client”
我做错了什么?我不想将用户ID添加到发票中。正如@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用户
但如果您更喜欢idea with scope,则应将客户表与范围内的发票相关联:
class Invoice < ActiveRecord::Base
...
scope :by_user, lambda { |user| joins(:client).where("clients.user_id = ?", user.id) }
...
end
class发票
为什么不直接使用当前用户。客户机和当前用户。发票
?(编辑:假设用户
有很多:发票,:通过=>:clients
)我试过了,但它无法识别发票。用户
。我必须为此将用户id添加到发票表吗?不应该。您也可以在发票所属的位置建立反向关系。\u to:user,:through=>:client
.p.s。我最初的怀疑是,在您的范围内,这可能也是错误的——您是否在客户机和发票模型上设置了反向归属于关系?但是发票模型上的归属于:user
需要用户id
外键,不是吗?你需要through::client
?@gregates,正如我在中所看到的,belient\u to没有:through选项。我已经实现了上述功能,但在创建了一张属于客户和用户的发票后,invoice。用户给我nil
-怎么回事?对不起,你说得对。我以为我以前做过,但实际上我们用了has\u one:through
@Charles try在你的<代码>发票<代码>模型上有一个:user,through::client
。太棒了,成功了!我已相应地编辑了答案。谢谢你们两个!