0

次のようなモデルの例を考えます。

class Foo < ActiveRecord::Base
  belongs_to :bar
end

class Bar < ActiveRecord::Base
  has_many :foos
  belongs_to :baz
end

class Baz < ActiveRecord::Base
  has_many :bars
  belongs_to :qux
end

class Qux < ActiveRecord::Base
  resourcify
  has_many :bazzes
end

次のコードは期待どおりに機能します。

records = Foo.joins(bar: { baz: :qux }).merge(Qux.where(x: 17))

でも

records = Foo.joins(bar: { baz: :qux }).merge(Qux.with_role(:admin))

Fooテーブルの値が入力されたレコードのコレクションを返しquxxesます。これは、たとえば列がオンであるrecords.zがオンではない場合、欠落属性エラーが発生することを意味します。これを次の方法でほぼ修正できます。zfoosquxxes

records = Foo.select('foos.*').joins(bar: { baz: :qux }).merge(Qux.with_role(:admin))

quxxesしかし、これは、からfoosではなく、同じ名前を持つ列から値を取得するためid、欺瞞created_atupdated_atですquxxes

4

1 に答える 1

0

したがって、問題は、rolify がリレーションに選択を追加することであることが判明しました(このアダプターwith_roleの 23 行目)。

ActiveRecordselect ステートメントを格納する方法を調べた後(このファイルの 249 行目と 69 行目を参照)、次の解決策を見つけました。

records = Foo.joins(bar: { baz: :qux }).merge(Qux.with_role(:admin)).tap { |rel| rel.select_values = ['foos.*'] }

これにより、マージによって追加された選択が削除され、独自のものに置き換えられます。別の方法として、選択を呼び出しチェーンの最後に移動することもできます。これも機能しているようです。

records = Foo.joins(bar: { baz: :qux }).merge(Qux.with_role(:admin)).select('foos.*')
于 2014-11-07T20:38:29.223 に答える