2015-06-14 17 views
8

Tôi muốn sử dụng UUID trong ứng dụng tôi đang xây dựng và đang gặp sự cố. Do UUID (v4) không thể sắp xếp được vì chúng được tạo ngẫu nhiên, tôi đang cố gắng ghi đè ActiveRecord :: Base # trước, nhưng Rails không quá hài lòng với điều đó. Nó hét lên với tôi nói rằng 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. Tôi có để sử dụng một phương pháp khác nếu tôi muốn sắp xếp và sắp xếp chính xác không?UUID có thể sắp xếp và ghi đè ActiveRecord :: Base

Đây là nước sốt:

# 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

tham khảo:

Trả lời

4

Trước hết, firstlast không đơn giản như bạn nghĩ là: bạn hoàn toàn bỏ qua đối số limit rằng cả hai phương pháp đó đều hỗ trợ.

Thứ hai, scope là ít hơn một cách ưa thích để thêm các phương thức lớp có ý định trả về truy vấn. Phạm vi của bạn đang lạm dụng scope vì chúng trả về các phiên bản đơn lẻ thay vì truy vấn. Bạn hoàn toàn không muốn sử dụng scope, bạn chỉ đang cố gắng thay thế các phương thức lớp học firstlast vì vậy tại sao bạn không chỉ ghi đè lên chúng? Bạn sẽ cần phải ghi đè chúng đúng cách và điều đó sẽ yêu cầu đọc và hiểu nguồn Rails để bạn bắt chước đúng những gì find_nth_with_limit làm. Bạn muốn ghi đè second, third, ... và phần còn lại của những phương thức ngớ ngẩn đó khi bạn đang ở đó.

Nếu bạn không cảm thấy đúng về thay thế firstlast (một điều tốt IMO), sau đó bạn có thể thêm một phạm vi mặc định để đặt điều như mong muốn:

default_scope -> { order(:created_at) } 

Tất nhiên, phạm vi mặc định đi kèm với bộ vấn đề của riêng họ và lén lút mọi thứ vào ORDER BY như thế này có thể sẽ buộc bạn gọi reorder bất cứ lúc nào bạn thực sự muốn chỉ định ORDER BY; hãy nhớ rằng nhiều cuộc gọi đến order thêm điều kiện đặt hàng mới, chúng không thay thế điều kiện đã có sẵn.

Tôi nghĩ rằng bạn đang đi về tất cả điều này sai. Bất cứ lúc nào tôi thấy M.first Tôi cho rằng một cái gì đó đã bị lãng quên. Đặt hàng mọi thứ theo số id là khá nhiều vô ích, do đó bạn nên luôn luôn theo cách thủ công chỉ định thứ tự bạn muốn trước khi sử dụng các phương thức như firstlast.

Các vấn đề liên quan