주문이있는 Rails 4 has_many에 대한 더 이상 사용되지 않는 경고


105
class RelatedList < ActiveRecord::Base
  extend Enumerize

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

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

end

콘솔에서 레코드를 만들려고 할 때 경고를 표시하는 레일스 앱에이 모델이 있습니다.

지원 중단 경고 : RelatedList.has_many : contents 선언의 다음 옵션이 지원 중단되었습니다. : order. 대신 범위 블록을 사용하십시오. 예 : has_many : spam_comments, 조건 : {spam : true}, class_name : 'Comment'는 다음과 같이 다시 작성해야합니다. has_many : spam_comments,-> {where spam : true}, class_name : 'Comment'. (/Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7에서 호출)

Rails 4에는 모델에서 사용하기위한 새로운 : order 구문이있는 것 같지만 Rails Guides에서 문서를 찾을 수없는 것 같습니다.

답변:


250

Rails 4에서는 :order더 이상 사용되지 않으며 질문에 게시 한 경고에 표시된대로 람다 범위 블록으로 교체해야합니다. 주목해야 할 또 다른 점은이 범위 블록이 dependent: :destroy etc 와 같은 다른 연결 옵션보다 먼저 전달되어야한다는 것입니다 .

이것을 시도하십시오 :

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

주문 방향을 지정하려면 asc또는 desc@ joshua-coady 및 @wsprujit가 제안한대로 다음을 사용하십시오.

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

또는 해시 스타일 사용 :

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

활성 레코드 범위에 대한has_many 추가 참조 .


3
훌륭하게 작동합니다! 가이드 또는 문서에서 그러한 정보를 어디에서 찾을 수 있습니까? 찾을 수 없습니다. 감사.
shankardevy 2013-08-17


4
두 개 이상 사용되지 않는 옵션이있는 경우에 대해, 무슨 말을 oder하고 include? 이 : { order(:position), include(:track) }쉼표에 오류가 발생합니다.
kakubei 2013

2
asc / desc를 주문하려면 다음을 사용하십시오.-> { order(name: :asc) }
wspruijt

1
어떤 이유로 컬렉션을 몇 번 주문하기를 원할 경우 list.contents.order('position desc')모델을 방해하지 않고 전체적으로 더 효율적일 수도 있습니다 (투표 된 답변에서 목록은 콘텐츠 필드를 알고 있으며 여기에서 컨트롤러는이를 알고 있습니다 )
Dirty Henry

35

순서를 지정하고 포함하는 방법을 파악하는 데 시간이 좀 걸렸습니다. 결국 범위 설명 을 연결하는 것을 발견했습니다 .

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

2
이것은 정확히 내 문제였습니다. 부모 속성으로 has_many 관계를 정렬하는 방법을 알아 내려고합니다. 이렇게 포함하고 주문할 수 있다는 것을 몰랐습니다. 감사!
timothyashaw 2011

27

옵션 해시 인수가 있으면 다음과 같이 람다를 따라야한다고 추가 할 것이라고 생각했습니다.

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

이 문제를 직접 해결하는 데 잠시 시간이 걸렸습니다.이 질문에 동일한 문제가있는 다른 사람에게 도움이되기를 바랍니다.


3
이것은 객체에 존재할 수있는 "통과"연관에도 해당됩니다.has_many :items, -> { order 'name' }, through: :suppliers
Major Major

0

이것은 Rails 4 및 MongoDB 에서 나를 위해 작동합니다.

has_many :discounts, order: :min_amount.asc

-4

또는 order모델에 절을 넣을 수 있습니다 . 예를 들면 다음과 같습니다.

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

된다

has_many :options # In class Answer

default_scope { order 'name' } # In class Option

PS : 내가 가진 ArgumentError: wrong number of arguments (1 for 0)수행 할 때 has_many :things, -> {}.


4
기본 범위를 사용하지 마십시오. 익숙하다면 마법의 방법에 더 많은 논리를 추가 할 수 있습니다. 앞으로 재정의하기가 어렵습니다.
Grzegorz Łuszczek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.