2017-12-30 19 views
0

私はRailsに少し慣れています。以前の小規模なアプリケーションでは、すべての種類の迷惑メールを持つコントローラを混乱させるでしょう。私はここにこのモデルを持っていると私はアルに私はこのfind_mapsを作成したのMapsそれhas_manyを見つけたいなど、Rails find_allモデルのメソッド

をより実効的にモデルを使用しようとしていますし、実際にモデルの機能について学ぶための良い場所を見つけることができません方法。私はそうのような方法で変数でこれを呼び出す使用私のsubaccounts_controller

class Subaccount < ApplicationRecord 
    belongs_to :account 
    has_many :users 
    has_many :maps 

    enum state: { active: 0, inactive: 1 } 

    def find_maps 
    Map.where(subaccount_id: self.id).all 
    end 
end 

class SubaccountsController < ApplicationController 
    def show 
    @submaps = Subaccount.find_maps 
    end 
end 

これで、そのコントローラの表示ビューにジャンプしてこのコードを使用するとします。

<% @submaps.each do |sm| %> 
    <%= sm %> 
<% end %> 

このエラーが発生します。

undefined method `find_maps' for #<Class:0x007fbe95a3b1e0> Did you mean? find_each 

私がsub_accountモデルで呼び出す場合、なぜこの未定義のメソッドfind_mapsが得られますか?途中でベストプラクティスを確実に拾いたいと思っています。誰かが私を助けてくれますか?あなたがやった方法で定義されているので

答えて

0

、あなたがサブアカウントのインスタンス上でそれを呼び出す必要があり、このよう

def find_maps 
    Map.where(subaccount_id: self.id).all 
end 

。例えば。

  • Subaccount.first.find_maps
  • Subaccount.new.find_maps
  • Subaccount.find(some_id).find_maps

あなたは

def self.find_maps 
    Map.where(subaccount_id: self.id) 
end 

としてそれを定義するサブアカウントクラスでそれを呼び出したい場合は、私が無用である.allを削除しました。すべてのマップが必要な場合や、where句を指定した場合両方とも同時に意味をなさない。

+0

私はあなたが実際にそれがインスタンスメソッドになりたいと思います。 SubaccountクラスにはIDがないので、あなたはnilを取得しています。代わりに、コントローラコードを変更してSubaccountを参照してください。 'Subaccount.find(params [:id])。find_maps' –

+0

はい、申し訳ありません。このように、クラスメソッドがあるので意味をなさないが、その中に 'id'を使用しているので、インスタンスがはっきりしない。私は混乱しているので、ユーザーが何をしたいのか理解しなければならない – Ursus

0

find_mapsメソッドは、has_many :mapsを呼び出すと、ActiveRecordが実際に追加するメソッドを複製します。

お使いのコントローラのshowメソッドでは、あなたは、現在表示されているサブアカウントを調べる必要があり、その上で地図を呼び出す:

Subaccount.find(params[:id]).maps

関連する問題