Pour tous ceux qui rencontrent cette question en utilisant des versions plus récentes de Rails, le deuxième argument de l'option has_many
est une portée facultative depuis Rails 4.0.2. Exemples de les docs (voir les exemples de champs d'application et d'options) incluent :
has_many :comments, -> { where(author_id: 1) }
has_many :employees, -> { joins(:address) }
has_many :posts, ->(blog) { where("max_post_length > ?", blog.max_post_length) }
has_many :comments, -> { order("posted_on") }
has_many :comments, -> { includes(:author) }
has_many :people, -> { where(deleted: false).order("name") }, class_name: "Person"
has_many :tracks, -> { order("position") }, dependent: :destroy
Comme répondu précédemment, vous pouvez également passer un bloc à has_many
. "Ceci est utile pour ajouter de nouveaux trouveurs, créateurs et autres méthodes de type usine à utiliser dans le cadre de l'association." ( même référence - voir Extensions).
L'exemple qui y est donné est le suivant :
has_many :employees do
def find_or_create_by_name(name)
first_name, last_name = name.split(" ", 2)
find_or_create_by(first_name: first_name, last_name: last_name)
end
end
Dans les versions plus modernes de Rails, l'exemple de l'OP pourrait être écrit :
class Log < ApplicationRecord
has_many :items, -> { order(some_col: :desc) }
end
Gardez à l'esprit que cette méthode présente tous les inconvénients des paramètres par défaut. Vous préférerez peut-être l'ajouter en tant que méthode distincte :
class Log < ApplicationRecord
has_many :items
def reverse_chronological_items
self.items.order(date: :desc)
end
end