2016-06-22 4 views
1

私はユーザモデルを持っています。Rails:スコープクエリでサービスクラスメソッドを使用する

オンボーディングプロセスを完了したユーザーのみを表示するようにユーザーインデックスビューを設定しようとしています。

それを行うに私のアプローチは次のとおりです。

インデックス:

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

I:私のuser.rbで

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

、私はとして、オンボーディングのために、範囲を定義しようとしました私の組織のサービスクラスに以下のようなメソッドを持っている:

class UserOrganisationMapperService 

    attr_accessor :user 
private 

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

    end 

私はこれをしようとすると、私が言うエラーを取得する:私が間違って行ってきたところ

undefined method `onboarded' for Users:Module 

は誰でも見ることができますか?

+0

まず:あなた 'user.rb'で' Users'または 'User'あなたはそれが超スローされた状態で[OK]をしている場合しかし、あなたはこれを行うことができますファイル..クラスの実際の名前は何ですか?なぜなら、 'User'ではなく' User'でなければならないからです。 –

+0

あなたは 'user.rb'で' onboarded'を定義しましたが、あなたは 'Users'モジュールでそれを呼び出しています。あなたは 'User'でそれを呼び出すべきです。 –

+0

第2に: 'scope:onboarded、 - > {where(:user_is_matchable?)}'これはうまくいきません。有効範囲はActiveRecordクエリです。データベース内の実際の構造の詳細しか処理できません。ユーザーのテーブルに 'user_is_matchable? 'という*カラム*がない場合、このスコープは不平を言って動作しません。 –

答えて

1

user.rbファイルには、UsersまたはUserがあります。クラスの実際の名前は何ですか?これは、Userではありません。Users

第2に: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 

または似たような...

+0

こんにちは - 私は、そのアイデアを使用することができます。自分のデータベースに「一致する組織ID」がありません。私はあるかどうかを確認する方法があります。代わりに、私はこのアイデアを使用することができますが、コードで書く方法はわかりません:scope:onboarded、 - > {where( "user.profile_id IS NOT NULL、user.profile.organisation_id is not NULL")} – Mel

+0

私は2番目の示唆(自分のための方法。onboarded)、このエラーが発生します:未定義のメソッド 'user_is_matchable? ' for# Mel

+1

@Melそれは 'user_is_matchable? 'がプライベートメソッドであるため、' private'宣言の上に移動します – jamesc

関連する問題