2015-08-17 6 views
1

Вот что я получил до сих пор:Рельсы ассоциация with_deleted объем не работает с заказом

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 

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

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

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

Даже где положение, которое говорит, включают x.deleted_at IS NULL OR x.deleted_at IS NOT NULL, так как они будут отклонены в соединении они не включены.

Я использую рельсы 4.2.3 и paranoia 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 } 

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

ответ

0

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