2017-09-21 13 views
0

ほとんどのクエリをスコープ(company_search_params)に移動することで、Companies_Controller#indexメソッドをリファクタリングして、ロジックを少なくすることを試みています。モデルスコープの引数エラー

paramをモデルスコープに渡す最も良い方法は何ですか? 引数の数が間違っています(0、予想される1が与えられました)。私はスコープを書くのは比較的新しいので、Railsガイドに当てはまる引数や条件を渡すことについてはあまり見つけられませんでした。

企業コントローラ

def index 
    params[:name_contains] ||= '' 
    Company.company_search_params(params[:name_contains]) 

    @search = Company.company_search_params 
    @companies = @search.page(params[:page]) 
    end 

会社のモデルあなたの助けを

scope :company_search_params, ->(name_contains){ 
    where(
    <<-SQL 
     "name LIKE :match OR subdomain LIKE :match", { match: "%#{name_contains}%" } 
    SQL 
    ).where(is_archived: false).order(name: :asc) 
    } 

感謝。あなたのcompany.rbであなたの問題のために

をnamed_scopeサンプルと情報

scope :named_scope, lambda { 
    |variable1, variable2| 
    where... 
    order... 
} 

#when you call it from your controller 

Model.named_scope("value 1","value 2") 

を使用して

+0

は、なぜあなたは 'の両方を持っていますCompany.company_search_params(params [ :name_contains]) 'と' @search = Company.company_search_params'?戻り値に注意を払っているため、最初は何も実行されません。2番目のエラーはエラーの原因です。 –

+0

@muistooshortありがとう、私は冗長性をキャッチせず、それが無効になっていることを認識しました。 – VegaStudios

答えて

0

scope :company_search_params, lambda { 
    |name_contains| 
    where(
    <<-SQL 
    "name LIKE :match OR subdomain LIKE :match", { match: "%#{name_contains}%" } 
    SQL 
).where(is_archived: false).order(name: :asc) 
} 

company_controller.rb

def index 
    @search = Company.company_search_params(params[:name_contains]) 
    @companies = @search.page(params[:page]) 
end 
+0

ありがとう@widjajayd – VegaStudios