Construire un ActiveRecord Rails où la clause
Quelle est la meilleure façon de construire une clause where à l'aide de Rails de ActiveRecord? Par exemple, disons que j'ai un contrôleur de l'action qui retourne une liste d'articles du blog:
def index
@posts = Post.all
end
Maintenant, disons que je veux être en mesure de passer en paramètre de l'url, de sorte que cette action de contrôleur retourne uniquement des messages par un auteur en particulier:
def index
author_id = params[:author_id]
if author_id.nil?
@posts = Post.all
else
@posts = Post.where("author = ?", author_id)
end
end
Cela ne me sens pas très à SEC pour moi. Si je devais ajouter de la commande ou de la pagination ou, pire encore, de plus en plus facultatif chaîne de requête URL paramètres de filtrage, ce contrôleur de l'action deviendrait très compliqué.
source d'informationauteur Kevin Pang
Vous devez vous connecter pour publier un commentaire.
Comment sur:
Post.scoped
est essentiellement un paresseux chargé équivalent à la Poste.tous (car le Post.tous les renvoie un tableauimmédiatement, tandis que le Post.l'étendue retourne juste une relation d'objet). Cette requête ne sera pas exécutée jusqu'à ce que
vous avez réellement essayez d'effectuer une itération sur dans la vue (en l'appelant .chaque).
Mmmh, la meilleure approche que vous souhaitez utiliser peut être la diffusion de cette en 2 actions
À mon humble avis il a plus de sens si vous pensez à une API RESTful, l'indice moyen de la liste de tous et d'obtenir (ou afficher) pour aller chercher la demande de l'une et de le montrer!
Vous devriez modèle d'url à l'aide de imbriquée ressources. L'url attendu serait /auteurs/1/posts. Pense à des auteurs comme des ressources. Lisez à propos de imbriquée ressources dans ce guide: http://guides.rubyonrails.org/routing.html (faites défiler jusqu'à 2,7 Imbriquée Ressources).
Serait quelque chose comme ce travail?
Ensuite, vous pouvez faire quelque chose comme:
?filtre[author_id]=1&filtre[post_date]=... etc.