如何在Rails中编写作用域?

时间:2016-07-28 23:16:42

标签: ruby-on-rails ruby scope

我正在尝试学习如何在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

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

有谁能看到我在这里做错了什么?我不了解如何编写范围。

2 个答案:

答案 0 :(得分:2)

在你的模型中,试试这个:

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

答案 1 :(得分:1)

赞成的回答是错误的(没有个人的, @Hasmukh Rathod ) - organisation_id表中没有users列(反之亦然 - 有一个{ user_id表格中的{1}}列。

我建议采用以下解决方案:

organisations

具有上述范围,您需要做的是将scope :same_org, ->(owner_id) { joins(organisation: :user).where(users: { id: owner_id }) } 作为参数传递。我确信有一种方法可以让它在没有通过范围的论证的情况下工作,但我还不确定如何(我刚刚醒来:D)。

所以例子:

owner_id