2010-05-23 12 views
0

Salut un modèle comme celui-ci:named_scoped exécuter seulement quand il y a des params présents

class EventDate < ActiveRecord::Base 
belongs_to :event 

named_scope :named, lambda { | name | { 
    :joins => { :event => :core}, 
    :conditions => ["name like ?", "%#{ name }%"] 
    }} 

    named_scope :date_range, lambda { | start, length | { 
    :conditions => ["day >= ? AND day <= ?", start, date + (length || 30) ] 
    }} 

cela fonctionne correctement si je lance name = "ba" start = Date.today EventDate.named (nom) .date_range (démarrage, démarrage + 2)

Mais si le nom ou le début est nul je ne veux pas exécuter le named_scope comme name = nul de .date_range EventDate.named (nom) (, démarrage + 2)

Est-il possible de définir une condition interne à named_scope?

grâce

Répondre

1

Oui, font juste:

unless name.blank? 

A l'intérieur du lambda. De cette manière, vous pouvez également définir une requête par défaut sur execute si le paramètre param n'est pas donné

0

Named_scope n'était pas conçu pour gérer ce type de logique. Il a été conçu pour vous aider à définir certaines conditions qui peuvent survenir souvent.

L'appelant doit appeler named_scope appropriée en fonction params disponibles, à savoir il suffit d'ajouter une condition avant d'appeler named_scope. Par exemple:

if name.blank? 
    EventDate.date_range(start, end) 
else 
    EventDate.named(name).date_range(start, end) 
end 

Cela étant dit, techniquement, vous pourriez faire quelque chose de similaire dans un périmètre lui-même. Lambda créé pour named_scope doit retourner un hash et vous pouvez y mettre votre chèque (mais ne le faites pas!) Et retourner un hash vide si le nom est vide. Par exemple:

named_scope :named, lambda { | name | 
    name.blank? ? {} : { :conditions => ["name like ?", "%#{ name }%"] } 
}