2016-08-14 6 views
1

私はパラノイアの宝石を使用していますが、今は問題に苦しんでいます。私はhas_many削除された項目を結合する必要がありますが、それは削除されていないだけを返します。私のモデルは:私が削除されたアイテムでmailingsを返すべき実行しているよパラノイアジェム - 削除されたアイテムとの結合

class Mailing < ActiveRecord::Base 

    acts_as_paranoid 

    has_many :mailing_fields 
    has_many :fields, through: :mailing_fields 

end 

class MailingField < ActiveRecord:: 

    belongs_to :mailing 
    belongs_to :field 

end 

class Field < ActiveRecord::Base 

    has_many :mailing_fields, dependent: :destroy 
    has_many :mailings, through: :mailing_fields 

end 

問合せ:

Field.joins(:mailings).where('mailings.id = ?', mailing_id) 

答えて

1

パラノイド宝石には削除済みアイテムにアクセスするためのスコープが組み込まれています:with_deleted。

Mailing.with_deleted.joins(:fields).where(id: mailing_id) 
1

paranoid逸品問合せのみで非削除された項目を含むデフォルトのスコープを設定します。回避策は次のようになります。

Field.joins(:mailings).where('mailings.id = ? mailings.deleted_at != ?', mailing_id, nil) 
1

は、次のようなクエリでスコープを削除できます。

Field.joins(:mailings).where("mailings.deleted_at != :deleted_status OR mailings.deleted_at = :deleted_status", deleted_status: nil).where(mailings: { id: mailing_id }) 

をしたり、多くの関係に多くあるように思わFieldを取得しようとしていることから、クエリを逆順にすることをお勧めします。

Mailing.unscoped.joins(:fields).find(mailing_id).fields 

私が手伝ってくれたかどうか教えてください。

0

私がこれまでに見つけた唯一の実用的なソリューションは、手動で指定することで、JOIN:

Field.joins('INNER JOIN "mailings" ON "mailings"."id" = "fields"."mailing_id"') 
    .where('mailings.id = ?', mailing_id) 
関連する問題