Si vous travaillez avec des modèles ActiveRecord, n'oubliez pas que vous pouvez effectuer votre sélection au niveau de la base de données plutôt qu'en mémoire. Pour reformuler, vous pouvez extraire de la base de données uniquement les valeurs que vous souhaitez dans votre tableau, puis simplement les modifier.
Voici un exemple en utilisant trouveurs personnalisés (sorte d'une façon plus de le faire):
class Question < ActiveRecord::Base
has_many :answers do
def accepted
find :all, :conditions => { :accepted => true }
end
end
end
class Answer < ActiveRecord::Base
belongs_to :question
end
q = Question.find :first
q.answers.accepted.each { |a| a.do_something! }
ou vous pouvez le faire avec une autre association:
class Question < ActiveRecord::Base
has_many :answers
has_many :accepted_answers, :class_name => "Answer", :conditions => { :accepted => true }
end
class Answer < ActiveRecord::Base
belongs_to :question
end
q = Question.find :first
q.accepted_answers.each { |a| a.do_something! }
Voici un autre exemple en utilisant named scopes (un peu plus récent, et préféré à mon avis) sur votre classe enfant:
class Question < ActiveRecord::Base
has_many :answers
end
class Answer < ActiveRecord::Base
belongs_to :question
named_scope :accepted, :conditions => { :accepted => true }
end
q = Question.find :first
q.answers.accepted.each { |a| a.do_something! }
Mais dans tout des cas, vous avez Abstraite la « sélection », qui a quelques avantages:
- plus rapide dans les cas de grandes collections
- Vous avez Abstraite les plus bas critères de sélection de niveau à quelque chose avec le sens sémantique de niveau supérieur , ce qui rend votre code plus facile à lire et à maintenir
wow, 6 lignes coupées, merci – Valentin
Ça va aussi être plus efficace que d'utiliser #select suivi de #each parce que vous n'aurez qu'à parcourir le tableau une fois . – Pesto