Vous pouvez ajouter un counter cache au modèle Comment
et un couple de named scopes au modèle Post
. Quelque chose comme:
class Post < ActiveRecord::Base
has_many :comments
named_scope :recent, :limit => 10, :order => 'created_at DESC'
named_scope :uncommented, :conditions => { :comments_count => 0 }
end
class Comment < ActiveRecord::Base
belongs_to :post, :counter_cache => true
end
Si vous utilisez Rails 3, alors la syntaxe de champ le nom est un peu différent:
class Post < ActiveRecord::Base
has_many :comments
scope :recent, limit(10).order('posts.created_at DESC')
scope :uncommented, where(:comments_count => 0)
end
vous pouvez maintenant trouver les messages sans commentaires en enchaînant les champs nommés ensemble:
@uncommented = Post.recent.uncommented
Si vous voulez récupérer tous les messages sans commentaires (non seulement les dix postes les plus récents), il serait:
@uncommented = Post.uncommented
— Vous avez peut-être remarqué que dans les rails 3 exemple I inclus le nom de la table posts
dans le périmètre :recent
. C'est une bonne pratique à suivre pour éviter les noms de colonne ambigus dans les requêtes SQL si deux tables ont le même nom de colonne. This Railscast explique plus.
d'ailleurs vous devriez avoir des guillemets doubles pour que # {id} soit substitué –
Mieux vaut ne pas le faire de toute façon car cela pourrait ouvrir votre code à l'injection SQL.Pour ce faire: conditions => ['(SELECT ... O WH post_id =?) = 0', id] – hurikhan77
@ hurikhan77: Vous avez raison. Je me référais à une relation ActiveRecord où il serait bon de faire comme je l'ai écrit. – fphilipe