2013-08-17 25 views
86
class RelatedList < ActiveRecord::Base 
    extend Enumerize 

    enumerize :list_type, in: %w(groups projects) 

    belongs_to :content 
    has_many :contents, :order => :position 

end 

Tôi có mô hình này trong ứng dụng đường ray của tôi, cảnh báo này khi tôi cố gắng tạo bản ghi trong bảng điều khiển.Cảnh báo không được chấp nhận cho Rails 4 has_many với đơn đặt hàng

deprecation Chú ý: Các tùy chọn sau trong RelatedList.has_many của bạn: khai nội dung được chấp nhận:: trật tự. Thay vào đó, hãy sử dụng khối phạm vi. Ví dụ: như sau: has_many : spam_comments, điều kiện: {spam: true}, class_name: 'Comment' nên được viết lại như sau: has_many: spam_comments, -> { nơi spam: true}, class_name: 'Comment ' . (Gọi tắt là từ ít /Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7)

Nó có vẻ như Rails 4 có mới: cú pháp để sử dụng trong các mô hình nhưng tôi không thể dường như tìm tài liệu trong Rails Guides.

Trả lời

214

Trong Rails 4, :order không được dùng nữa và cần được thay thế bằng khối phạm vi lambda như được hiển thị trong cảnh báo bạn đã đăng trong câu hỏi. Một điểm cần lưu ý là khối phạm vi này cần phải được thông qua trước khi bất kỳ tùy chọn liên quan khác như dependent: :destroy, vv

này cung cấp cho một thử:

has_many :contents, -> { order(:position) } 

Để xác định hướng trật tự, tức là một trong hai asc hoặc desc như @ joshua-Coady và @wsprujit đã gợi ý, sử dụng:

has_many :contents, -> { order 'position desc' } 

đó hoặc sử dụng băm phong cách:

has_many :contents, -> { order(position: :desc) } 

Tham khảo thêm về Active Record Scopes for has_many.

+3

hoạt động tuyệt vời! nơi tôi có thể tìm thấy thông tin đó trong hướng dẫn hoặc tài liệu? Tôi không thể tìm thấy. cảm ơn. – shankardevy

+1

[Thông tin về phạm vi đơn đặt hàng trong hướng dẫn] (http://guides.rubyonrails.org/association_basics.html#scopes-for-has-many-order) –

+4

Còn nếu bạn có nhiều tùy chọn không được chấp thuận, hãy nói 'oder 'và' include'?Điều này: '{order (: position), include (: track)}' ném lỗi trên dấu phẩy. – kakubei

26

Tôi đã mất một thời gian để tìm ra cách để làm trình tự, bao gồm, tôi cuối cùng đã phát hiện ra rằng bạn chain the scope báo cáo,

has_many :things, -> { includes(:stuff).order("somedate desc") }, class_name: "SomeThing" 
+0

Đây chính là vấn đề của tôi. Đang cố gắng tìm ra cách đặt hàng mối quan hệ has_many theo thuộc tính cha mẹ. Không nhận ra bạn có thể làm bao gồm như thế này và sau đó đặt hàng. Cảm ơn! – timothyashaw

-4

Ngoài ra, bạn có thể đặt mệnh đề order trên mô hình, ví dụ:

has_many :options, order: 'name' # In class Answer 

trở thành

has_many :options # In class Answer 

default_scope { order 'name' } # In class Option 

P S: Tôi nhận được ArgumentError: wrong number of arguments (1 for 0) khi thực hiện has_many :things, -> {}.

+4

Không sử dụng phạm vi mặc định. Nếu bạn đang sử dụng để làm điều đó, bạn có thể thêm vào đó phương pháp phép thuật logic hơn. Thật khó để ghi đè lên nó trong tương lai. –

13

Chỉ cần nghĩ rằng tôi muốn thêm rằng nếu bạn có bất kỳ đối số tùy chọn băm, họ phải đi sau khi lambda, như thế này:

has_many :things, -> { order :stuff }, dependent: :destroy 

Đã cho tôi một phút để con số này ra bản thân mình - hy vọng nó giúp bất cứ ai khác đến câu hỏi này có cùng một vấn đề.

+0

Điều này cũng đúng với các liên kết "qua" có thể tồn tại trên đối tượng - 'has_many: items, -> {order 'name'}, thông qua:: suppliers' –

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