2016-07-28 45 views
1

我想学习如何在Rails中编写范围。如何在Rails中编写范围?

我有用户,组织和组织请求的模型。该协会是:

User 
    has_one :organisation 

Organisation 
    belongs_to :owner, class_name: 'User' 
    has_many :organisation_requests 

Organisation_request 
    belongs_to :organisation 

在我的组织要求的模式,我试图写一个范围,以挑选出属于该组织的所有者所有组织的请求。

scope :same_org, where(:organisation_id => owner.organisation_id) 

然后在我的organisation_requests控制器,我有:

def index 
    @organisation_requests = OrganisationRequest.same_org 
end 

我试过以上。所有者是用户的别名。在每个组织中,一名用户被提名为该组织的所有者。我希望该用户查看该组织请求的索引。

任何人都可以看到我在这里做错了吗?我不理解如何编写示波器。

+1

的语法使用拉姆达为Hasmukh的答案节目。参见[http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-scope](http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods .html#method-i-scope) –

+0

嘿,你解决了这个问题吗? –

+0

嗨@AndreyDeineko - 我仍然试图解决它。我有另一个问题阻止我调用范围 - 所以我正在努力。我有你的笔记,并会更新,以接受你的答案,如果我得到它的工作。感谢您的跟踪。我学得很慢... – Mel

回答

2

在你的模型,试试这个:

scope :same_org, -> {where(:organisation_id => owner.organisation_id) } 
+0

错了。您如何期望拥有者在关系中拥有'organisation_id',哪里有'organisation'' belongs_to'拥有者? –

1

的upvoted答案是错的(没有个人色彩,@Hasmukh Rathod) - 没有organisation_idusers表(它实际上是反之亦然 - 有表0123B中的user_id列)。

我建议以下解决方案:

scope :same_org, ->(owner_id) { joins(organisation: :user).where(users: { id: owner_id }) } 

具有上述范围内,你需要做的,是将owner_id作为参数传递。我敢肯定,有一种方法可以在不向范围传递参数的情况下工作,但我还不确定(我刚刚醒来:D)。

所以例如:

​​