2015-06-14 16 views
8

Desidero utilizzare gli UUID in un'app che sto creando e sto incontrando un po 'di problemi. A causa degli UUID (v4) che non sono ordinabili perché sono generati casualmente, sto provando a sovrascrivere ActiveRecord :: Base # prima, ma Rails non ne è molto contento. Mi urla dire ArgumentError: You tried to define a scope named "first" on the model "Item", but Active Record already defined a class method with the same name. per utilizzare un metodo diverso se voglio ordinare e ordinarlo correttamente?UUID ordinabili e sovrascrivendo ActiveRecord :: Base

Ecco la salsa:

# lib/sortable_uuid.rb 
module SortableUUID 
    def self.included(base) 
    base.class_eval do 
     scope :first, -> { order("created_at").first } 
     scope :last, -> { order("created_at DESC").first } 
    end 
    end 
end 


# app/models/item.rb 
class Item < ActiveRecord::Base 
    include SortableUUID 
end 

Rails 4.2, Ruby 2.2.2

Riferimento:

risposta

4

Prima di tutto, first e last non sono così semplici come sembra che lo siano: si sta completamente trascurando l'argomento limit supportato da entrambi i metodi.

In secondo luogo, scope è poco più di un modo ingegnoso di aggiungere metodi di classe che hanno lo scopo di restituire le query. I tuoi ambiti stanno abusando di scope perché restituiscono istanze di modelli singoli piuttosto che query. Non vuoi affatto usare scope, stai solo cercando di sostituire i metodi di classe first e last quindi perché non li sostituisci? Dovresti comunque sovrascriverli correttamente e ciò richiederà la lettura e la comprensione dell'origine Rails in modo da simulare correttamente ciò che fa find_nth_with_limit. Dovresti ignorare lo second, third, ... e il resto di quei metodi sciocchi mentre ci sei.

Se non ci si sente di destra circa sostituire first e last (una cosa buona IMO), allora si potrebbe aggiungere un ambito predefinito per ordinare le cose, se lo desideri:

default_scope -> { order(:created_at) } 

Naturalmente, ambiti predefiniti dotati la loro serie di problemi e le cose furtivi nell'ORDINE BY come questo probabilmente ti costringeranno a chiamare reorder ogni volta che vuoi effettivamente specificare ORDER BY; ricorda che più chiamate allo order aggiungono nuove condizioni di ordine, non ne sostituiscono una già esistente.

Penso che tu stia sbagliando tutto questo. Ogni volta che vedo M.first presumo che qualcosa sia stato dimenticato. Ordinare le cose tramite id è praticamente inutile quindi è necessario sempre specificare manualmente l'ordine desiderato prima di utilizzare metodi come first e last.

Problemi correlati