6

これを持っている:

class Event < ActiveRecord::Base
  belongs_to :historizable, :polymorphic => true
end

user = User.create!

私は出来ます:

Event.create!(:historizable => user)

しかし、私はできません:

Event.where(:historizable => user)
# Mysql2::Error: Unknown column 'events.historizable' in 'where clause'

代わりにこれを行う必要があります:

Event.where(:historizable_id => user.id, :historizable_type => user.class.name)

アップデート

問題を再現するコード:https ://gist.github.com/fguillen/4732177#file-polymorphic_where_test-rb

4

3 に答える 3

3

これはRailsマスターに実装されており、Rails4で利用できるようになります。ありがとうございます。

@carlosantoniodasilva

于 2013-02-08T17:15:06.420 に答える
0

私はこれをします:

user.events

これは適切なARクエリであり、他のスコープなどと連鎖させることができます。

user.events.where(<your event conditions here>)

編集:逆に、両方のフィールドを指定する必要があります(意味があります:ID 4のユーザーと、同じくID 4のパーティーなどのイベントを持つ別のユーザーがいる可能性があります)。

EDIT2:「なぜ機能するのか機能しないのか」についてcreatewhere前者は「完全なモデル」を扱い、後者はデータベーステーブルレベルで物事を管理するため、createより高レベルです。where

  1. ActiveRecord create(AFAIK)は、new+の組み合わせをupdate_paramどこかで使用しています。
  2. update_paramモデルのxxxx=メソッドを使用して、個々のプロパティを割り当てます。
  3. あなたの例でhistorizable=は、は式によって構築されたメソッドbelongs_toです。belongs_to多形であることを「知っている」ので、タイプとIDを処理できます。

一方、where句にハッシュを渡すと、そこにあるパラメータはデータベースフィールドのみを参照します。Railsは、「高レベル」アクセスのスコープを提供します。

class Event < ActiveRecord::Base
  ...

  scope :by_historizable, lambda { |h| where(:historizable_id => h.id, :historizable_type => h.class.name) }

end

...

Event.by_historizable(user).where(<your other queries here>)

これはRails4で変更されるwhere可能性があり、より「インテリジェント」になる可能性があると聞いています。しかし、私はまだチェックしていません。

于 2013-02-07T17:54:33.840 に答える
-2

試す:

Event.joins(:historizable).where(:historizable => {:historizable_type => user})
于 2013-02-07T15:01:19.250 に答える