2017-09-21 1 views
0

J'essaie de refactoriser la méthode d'index Companies_Controller # pour englober moins de logique en déplaçant la majeure partie de la requête dans une étendue, company_search_params.Erreur d'argument dans la portée du modèle

Quelle est la meilleure façon de transmettre le paramètre à la portée du modèle? Je reçois une erreur renvoyée, mauvais nombre d'arguments (donné 0, attendu 1). Je suis relativement nouveau dans l'écriture d'étendues et je n'ai pas trouvé grand-chose sur les arguments/conditions de passage applicables dans le Guide Rails.

sociétés Contrôleur

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

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

Modèle Société

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) 
    } 

Les Merci pour votre aide.

+0

Pourquoi avez-vous aussi bien ' Company.company_search_params (params [ : name_contains]) 'et' @search = Company.company_search_params'? La première ne fait rien parce que vous faites attention à la valeur de retour, la seconde cause votre erreur. –

+0

@muistooshort merci l'homme, je n'ai pas attrapé la redondance et je me rends compte que c'était primordial. – VegaStudios

Répondre

0

à l'aide exemple named_scope et informations

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

#when you call it from your controller 

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

pour votre problème

dans votre company.rb

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

Merci @widjajayd – VegaStudios