Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 访问作用域中的父对象_Ruby On Rails_Scope_Associations_Rails Activerecord - Fatal编程技术网

Ruby on rails 访问作用域中的父对象

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

我有一个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| 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
。太棒了,成功了!我已相应地编辑了答案。谢谢你们两个!