1

これが私がこれまでに得たものです:

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

include x.deleted_at IS NULL OR x.deleted_at IS NOT NULL という where 句を使用しても、結合で拒否されるため含まれません。

私は Rails 4.2.3 と paranoia 4.2.3 を使用しています。いくつかの設定を確認しようとしましたが、しばらくして Rails 4.2.1 を使用すると問題なく動作することがわかりました。可能であれば、Rails 4.2.3 を維持したいと思います。

問題を解決するにはどうすればよいですか? 誰かがアイデアを思いついたら、私はそれを試す準備ができています. 少し早いですがお礼を。


joins(:position) 、 joins(:member) 、およびその両方を追加しようとしましたが、結果は同じでした

変えてみた

belongs_to :member, -> { with_deleted }

為に

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

しかし、それは何も変わりません

4

1 に答える 1

1

あなたの例では、どちら:includesを使用するかをRailsに決定させるために使用しています。または、含まれているテーブルの属性を使用しているため、. 上記の説明から、これは Rails で現在未解決のバグhttps://github.com/rails/rails/issues/19226に関連していると言えます。 「結合された」テーブルは、. 私が知っている回避策はまだありません:preload:eager_load:joins:joinsdefault_scope

于 2015-10-02T18:14:59.370 に答える