Cảnh báo không được chấp nhận cho Rails 4 has_many có thứ tự


105
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 rails của mình. Nó đưa ra cảnh báo khi tôi cố gắng tạo bản ghi trong bảng điều khiển.

CẢNH BÁO DEPRECATION: Các tùy chọn sau trong khai báo RelatedList.has_many: nội dung của bạn không được dùng nữa:: order. Vui lòng sử dụng một khối phạm vi thay thế. Ví dụ: has_many: spam_comments, điều kiện: {spam: true}, class_name: 'Comment' phải được viết lại như sau: has_many: spam_comments, -> {where spam: true}, class_name: 'Comment'. (được gọi từ /Users/shivam/Code/auroville/avorg/app/models/osystem_list.rb:7)

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

Câu trả lời:


250

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 khác cần lưu ý là khối phạm vi này cần được chuyển trước bất kỳ tùy chọn liên kết nào khác, chẳng hạn như dependent: :destroy v.v.

Hãy thử cái này:

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

Để chỉ định hướng đặt hàng, tức là aschoặc descnhư @ joshua-coady và @wsprujit đã đề xuất, hãy sử dụng:

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

hoặc sử dụng kiểu băm:

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

Tham khảo thêm về Phạm vi Bản ghi Hoạt động chohas_many .


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


4
Còn nếu bạn có nhiều tùy chọn không dùng nữa, hãy nói oderinclude? This: { order(:position), include(:track) }ném lỗi vào dấu phẩy.
kakubei

2
Để đặt hàng asc / desc, hãy sử dụng-> { order(name: :asc) }
wspruijt

1
Nếu vì lý do nào đó, bạn chỉ muốn bộ sưu tập được sắp xếp theo thứ tự một lúc nào đó, bạn cũng có thể làm điều list.contents.order('position desc')đó có thể hiệu quả hơn về tổng thể và không xâm phạm mô hình (trong câu trả lời đã bỏ phiếu, danh sách biết một trường nội dung, ở đây bộ điều khiển biết điều đó )
Henry bẩn

35

Tôi đã mất một lúc để tìm ra cách sắp xếp và bao gồm, cuối cùng tôi nhận thấy rằng bạn xâu chuỗi các câu lệnh phạm vi ,

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

2
Đây chính xác là vấn đề của tôi. Đang cố gắng tìm ra cách sắp xếp mối quan hệ has_many theo thuộc tính cha. 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 11/1117

27

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

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

Cho tôi một phút để tự mình tìm ra điều này - hy vọng nó sẽ giúp ích cho bất kỳ ai khác đang hỏi câu hỏi này có cùng vấn đề.


3
Điều này cũng đúng đối với "thông qua" các hiệp hội có thể tồn tại trên các đối tượng -has_many :items, -> { order 'name' }, through: :suppliers
Chuyên ngành chính

0

Điều này phù hợp với tôi với Rails 4 & MongoDB

has_many :discounts, order: :min_amount.asc

-4

Ngoài ra, bạn có thể đặt ordermệnh đề 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

Tái bút: Tôi có ArgumentError: wrong number of arguments (1 for 0)khi làm has_many :things, -> {}.


4
Không sử dụng phạm vi mặc định. Nếu bạn đã quen với việc đó, bạn có thể thêm vào phương pháp ma thuật đó logic hơn. Thật khó để ghi đè nó trong tương lai.
Grzegorz Łuszczek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.