Как отсортировать записи по ассоциации? - PullRequest
0 голосов
/ 11 июля 2019

Как заказать записи по одной из связанных с ней моделей?В приведенном ниже коде при доступе к ассоциации .box_chocolates мне нужно, чтобы он возвращал записи, упорядоченные по Chocolate#name:

b = Box.first
b.box_chocolates # <-- records must be ordered by Chocolate#name

Структура моделей:

class Box < ApplicationRecord
  has_many :box_chocolates # <--- ???
end

class BoxChocolate < ApplicationRecord
  belongs_to :box
  belongs_to :chocolate
end

# id    :integer
# name  :string
class Chocolate < ApplicationRecord      
end

Я создал собственный метод в классе Boxно мне не нравится, как это работает - он использует Ruby для сортировки записей вместо SQL-запроса:

def ordered_box_chocolates
   box_chocolates.sort { |a, b| a.chocolate.name <=> b.chocolate.name }
end

Я знаю, что могу указать порядок в has_many, как в коде ниже, но это не такработа:

class Box < ApplicationRecord
  has_many :box_chocolates, -> { order("chocolate.name") }
end

Ответы [ 3 ]

2 голосов
/ 11 июля 2019

Вы можете создать область или метод в поле, как образец ниже

class Box < ApplicationRecord
  has_many :box_chocolates 

  def self.box_chocolates_ordered
    joins(box_chocolates: :chocolate).order('chocolates.name')
      # you have to use table name in plural form (chocolates)
  end
end

b = Box.first
b.box_chocolates_ordered
1 голос
/ 11 июля 2019

Попробуйте следующее:

has_many :box_chocolates, -> { order 'chocolates.name' }, through: :chocolate
1 голос
/ 11 июля 2019

b.box_chocolates.joins(:chocolate).order("chocolates.name asc")

...