Рельсовая ассоциация с областью видимости не работает с порядком
Вот что я получил так далеко:
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
, Обходного пути, о котором я знаю, пока нет