Рельсовая ассоциация с областью видимости не работает с порядком

Вот что я получил так далеко:

class MemberSitePosition < ActiveRecord::Base
  acts_as_paranoid
  belongs_to :member, -> { with_deleted }
  belongs_to :position
  ...
}
class Member < ActiveRecord::Base
  include ::Hierarchical
  acts_as_paranoid
  has_many   :member_site_positions
  ...
}

// Get all member associated to a site with their position
@msps = member_site_positions.includes(:position, { member { profile: :item }}).where(position_id: position_ids, member_id: member_ids)

@msps.each do |msp|
    member = msp.member
   // ... do stuff with member
end

Этот запрос работает как талисман, я связываю всех своих участников со всем моим сайтом с их позицией.

Но когда я попытался заказать их, я получил

@msps = member_site_positions.includes(:position, { member { profile: :item }}).where(position_id: position_ids, member_id: member_ids)
.order("positions.order") // adding the order

@msps.each do |msp|
    member = msp.member // Member is nil only if I pass the order (and member is deleted)
end

Удаленные участники теперь равны нулю, когда я пытаюсь получить к ним доступ.

Я обнаружил, что, когда я добавляю заказ, генерируется запрос на добавление

Left outer join tableX x ON x.id = main_table.x_id AND x.deleted_at IS NULL

Даже с предложением where, в котором указано: include x.deleted_at IS NULL ИЛИ x.deleted_at IS NOT NULL, поскольку они отклонены в соединении, но они не включены.

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

Что я должен сделать, чтобы решить мою проблему? Если у кого-то есть идея, я готов ее попробовать. Заранее спасибо.


Я пытался добавить объединения (: позиция), объединения (: член) и оба, но результат был одинаковым

Я пытался изменить

belongs_to :member, -> { with_deleted }

за

belongs_to :member, -> { with_deleted.unscope(where: :deleted_at) }
belongs_to :member, -> { unscope }

но это ничего не меняет

1 ответ

Решение

В вашем примере вы используете :includes которые позволяют Rails решать, хотите ли вы использовать :preload, :eager_load или же :joins и поскольку вы используете атрибут из включенной таблицы, то он идет с :joins, И с приведенным выше объяснением я могу вам сказать, что это связано с текущей открытой ошибкой в ​​Rails https://github.com/rails/rails/issues/19226 где таблица "join " игнорирует ваши настройки, пытающиеся переопределить default_scope, Обходного пути, о котором я знаю, пока нет

Другие вопросы по тегам