Rails 4 has_many with order için kullanımdan kaldırılan uyarı


105
class RelatedList < ActiveRecord::Base
  extend Enumerize

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

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

end

Bu model, konsolda kayıt oluşturmaya çalıştığımda uyarı veren raylar uygulamamda var.

KULLANIMDAN KALDIRMA UYARISI: RelatedList.has_many: içerik bildiriminizdeki şu seçenekler kullanımdan kaldırıldı:: order. Lütfen bunun yerine bir kapsam bloğu kullanın. Örneğin, şu: has_many: spam_comments, koşullar: {spam: true}, class_name: 'Comment' şu şekilde yeniden yazılmalıdır: has_many: spam_comments, -> {where spam: true}, class_name: 'Comment'. (/Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7 adresinden çağrılır)

Görünüşe göre Rails 4, modellerde kullanılmak üzere yeni: sipariş sözdizimine sahip, ancak belgeleri Rails Kılavuzlarında bulamıyorum.

Yanıtlar:


250

Rails 4'te :orderkullanımdan kaldırıldı ve soruda gönderdiğiniz uyarıda gösterildiği gibi lambda kapsam bloğuyla değiştirilmesi gerekiyor. Dikkat edilmesi gereken bir diğer nokta da, bu kapsam bloğunun, dependent: :destroy vb. Diğer ilişkilendirme seçeneklerinden önce geçirilmesi gerektiğidir .

Bunu bir deneyin:

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

Sipariş yönünü belirtmek için, yani ya ascya desc@wsprujit tavsiye ettiler ve @ Joshua-Coady olarak kullanın:

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

veya hash stilini kullanarak:

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

İçin Aktif Kayıt Kapsamları hakkındahas_many daha fazla referans .


3
mükemmel çalışıyor! bu tür bilgileri kılavuzlarda veya belgelerde nerede bulabilirim? Ben bulamıyorum. Teşekkürler.
shankardevy


4
Birden fazla kaldırılan seçeneği varsa hakkında, ne demek oderve include? Bu: { order(:position), include(:track) }virgülde hata atar.
kakubei

2
Artan / azalan sipariş için şunu kullanın-> { order(name: :asc) }
wspruijt

1
Herhangi bir nedenden ötürü, koleksiyonun sadece birkaç kez sipariş edilmesini istiyorsanız, list.contents.order('position desc')genel olarak daha verimli olanı da yapabilirsiniz ve model olarak müdahaleci değil (oylanan cevapta liste bir içerik alanını biliyor, burada kontrolör bunu biliyor )
Kirli Henry

35

Nasıl sipariş vereceğimi ve dahil edeceğimi anlamam biraz zaman aldı, sonunda kapsam ifadelerini zincirlediğini öğrendim.

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

2
Bu tam olarak benim sorunumdu. Bir has_many ilişkisinin bir ebeveyn özelliğine göre nasıl sıralanacağını bulmaya çalışıyorum. Bunun gibi şeyler yapıp sipariş verebileceğinizi fark etmemiştim. Teşekkürler!
timothyashaw

27

Eğer herhangi bir seçenek hash argümanınız varsa, lambda'nın peşinden gitmeleri gerektiğini eklemeyi düşündüm, şöyle:

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

Bunu kendim çözmem bir dakikamı aldı - umarım bu soruya gelen ve aynı sorunu yaşayan başka birine yardımcı olur.


3
Bu aynı zamanda nesnede var olabilecek "aracılığıyla" ilişkilendirmeler için de geçerlidir -has_many :items, -> { order 'name' }, through: :suppliers
Binbaşı Binbaşı

0

Bu benim için Rails 4 ve MongoDB ile çalışıyor

has_many :discounts, order: :min_amount.asc

-4

Alternatif olarak, ordermaddeyi modele koyabilirsiniz, örneğin:

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

Olur

has_many :options # In class Answer

default_scope { order 'name' } # In class Option

Not: ArgumentError: wrong number of arguments (1 for 0)Yaparken anladım has_many :things, -> {}.


4
Varsayılan kapsamı kullanmayın. Eğer bunu yapmaya alışkınsanız, bu sihirli yönteme daha fazla mantık ekleyebilirsiniz. Gelecekte onu geçersiz kılmak zor.
Grzegorz Łuszczek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.