Как определить именованные рамки с порядком по ассоциациям

У меня есть две модели.

 class Shoe < ActiveRecord::Base     
   has_many :sizes, :dependent => :destroy
   scope :brand_asc , order('brand ASC')  
   scope :brand_desc , order('brand DESC')
   attr_accessible :brand ,:model
 end


 class Size < ActiveRecord::Base
   belongs_to :shoe
   scope :size_brand_asc , order("#{self.shoe.brand} ASC")
   scope :size_brand_desc , order("#{self.shoe.brand} DESC")             
 end

It is very easy to call named scope on Shoe model like below.

  @shoes = Shoe.brand_asc

But i want to sort sizes on the base of "brand" that is attribute of shoe model.so this 

не работает для меня, как показано ниже.

   @sizes = Size.size_brand_asc  # giving error

Как я могу сортировать размеры по марке обуви

2 ответа

Решение

Вы можете достичь этого, выполнив следующие действия:

class Size < ActiveRecord::Base
  belongs_to :shoe
  scope :brand_ordered, lambda do |way = 'ASC'| 
    includes(:shoe).order("shoes.brand #{way}")
  end

Использование:

@sizes = Size.brand_ordered('DESC')
# or
@sizes = Size.brand_ordered('ASC')
# equivalent:
@sizes = Size.brand_ordered

В классе обуви:

class Shoe < ActiveRecord::Base
  scope :brand_ordered, lambda do |way = 'ASC'| 
    order("#{self.table_name}.brand #{way}")
  end           

Ответ в одну строку

scope :size_brand_asc, ->{joins(:shoe) & Shoe.brand_asc}
Другие вопросы по тегам