2017-12-30 13 views
0

레일스에 다소 익숙하며, 이전의 작은 어플리케이션에서는 모든 종류의 쓰레기가있는 컨트롤러를 어수선하게 잡아 먹었습니다. 모델을보다 효과적으로 사용하려고 시도하고 모델 기능 등에 대해 배울 좋은 곳을 찾을 수 없습니다.레일즈 find_all 모델 방법

나는이 모델을 가지고 있는데, 나는이 을 찾아 내고 싶다. 그래서이 find_maps 방법. 내 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 

. 예 :

당신은 내가 거기에 쓸모가 .all을 제거

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

으로 정의를 하위 계정 클래스를 호출 할 경우

  • Subaccount.find(some_id).find_mapsSubaccount.first.find_maps
  • Subaccount.new.find_maps
    • . 모든 맵을 원하거나 where 절을 지정하십시오. 동시에 둘 다 이해가되지 않습니다.

  • +0

    나는 당신이 실제로 인스턴스 방법으로 원하는 것 같아요. Subaccount 클래스에 ID가 없으므로 무효화됩니다. 대신 컨트롤러 코드를 수정하여 하위 계정을 조회하십시오. 'Subaccount.find (params [: id]). find_maps' –

    +0

    네, 죄송합니다. 클래스 메쏘드가 있기 때문에 이런 식으로는 이해가되지 않지만'id'를 사용하기 때문에 인스턴스가 명확하지 않습니다. 혼란스러워서 사용자가 원하는 것을 이해해야합니다. – Ursus

    0

    find_maps 메서드는 실제로 has_many :maps을 호출 할 때 ActiveRecord가 추가하는 메서드를 복제합니다. 컨트롤러 쇼 방법에

    , 당신은에지도를 당신이 현재 표시되는 하위 계정을 조회하고 호출해야합니다 :

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