Rails:在范围查询中使用服务类方法

时间:2016-06-22 04:38:01

标签: ruby-on-rails methods scope

我有一个用户模型。

我正在尝试设置我的用户索引视图,以便仅显示已完成入职流程的用户。

我这样做的方法是:

指数:

t

在我的user.rb中,我尝试为onboarding定义一个范围,如下:

<% Users.onboarded.each do |user| %>

我的组织服务类中有一个方法:

  scope :onboarded, -> { where (:user_is_matchable?) }

当我尝试这个时,我收到的错误是:

class UserOrganisationMapperService

  attr_accessor :user
private

  def user_is_matchable?
    profile.present? && matching_organisation.present?

  end

谁能看到我出错的地方?

1 个答案:

答案 0 :(得分:1)

首先:Users文件中的Useruser.rb ..该类的实际名称是什么?因为它应该是User而不是Users

其次:scope :onboarded, -> { where (:user_is_matchable?) }这不会起作用。范围是ActiveRecord查询 - 它只能处理数据库中实际结构的详细信息。如果您的用户表中没有名为user_is_matchable?,那么此范围会抱怨并且不起作用。

你需要将该范围变成可以在数据库上运行的东西。

我只是猜测(你没有在这里给我们你们关系的完整结构),但你能做的事情如下:

scope :onboarded, -> { where ("profile_id IS NOT NULL AND matching_organisation_id IS NOT NULL") }

???

或者,您需要让它在ruby中运行 - 这将更慢(特别是如果您的表变得非常大,因为用户表通常不会这样做)。但如果你对它的速度很慢,那么你可以这样做:

class User < ActiveRecord::Base
  def self.onboarded
    all.select(&:user_is_matchable?)
  end

或类似的......