Как заказать по связанной модели в области по умолчанию? - Рельсы 3.1 - PullRequest
7 голосов
/ 12 декабря 2011

Как написать следующую область по умолчанию:

class SimilarMerchant < ActiveRecord::Base

  # relationships
  belongs_to :merchant
  belongs_to :similar_merchant, :foreign_key => 'similar_merchant_id', :class_name => "Merchant"

  # scopes
  default_scope order('merchants.is_paid DESC').order('score DESC')

end

По сути, я хочу отсортировать по полю merchant.is_paid (которое относится к связанной модели)

Любой совет?

Ответы [ 3 ]

13 голосов
/ 12 декабря 2011

Попробуйте это:

default_scope joins(:merchant).order('merchants.is_paid DESC, score DESC')

И имейте в виду, что это может быть медленным, в зависимости от количества записей

5 голосов
/ 12 декабря 2011

вот что вы могли бы сделать, чтобы получить требуемую функциональность, но это не очень хорошая идея, пожалуйста, прочитайте до конца

Вы можете определить область действия по умолчанию, включив также торговую ассоциацию, а затем заказать по merchants.is_paid DESC, score DESC

будет выглядеть как

default_scope includes(:merchants).order('merchants.is_paid DESC, score DESC')

однако это означает, что каждый раз, когда вы захватываете подобные торговые объекты по любой причине, у вас также будет загружена ассоциация

это не очень хорошо, и я бы предложил иметь явную область для загрузки похожих торговцев с ассоциацией и упорядочением:

scope :with_merchants, includes(:merchants).order(...)

таким образом, вы всегда знаете в своем коде, что именно загружается из базы данных

2 голосов
/ 12 декабря 2011

Итак, вы хотите, чтобы все запросы из модели SimilarMerchant были упорядочены по столбцу в merchants? Я сомневаюсь в ваших требованиях, но если это так, вам придется присоединиться к таблице merchants также в области по умолчанию

default_scope joins(:merchant).order('merchants.is_paid DESC, similar_merchants.score DESC')

Будет лучше, если вы определите это как отдельную область и вызовете эту область, когда вам это нужно, вот так. Также вам нужно решить, нужно ли вам соотношение merchant или similar_merchant. Если вы хотите similar_merchant, вам придется сделать joins(:similar_merchant).

Обратите внимание, что: торговец в единственном числе. то есть вы должны указать имя отношения, указанное в модели (как в belongs_to :merchant).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...