4

私はこれを持っています:

class User < ActiveRecord::Base
  has_one :profile
end

class Profile < ActiveRecord::Base
  belongs_to :user

  has_one :latest_action, 
    :class_name=>'Action', 
    :conditions=> Proc.new {["action_at <= ?", self.timezone.now.to_date]},
    :order=>"action_at desc"
end

create_table "actions", :force => true do |t|
  t.date     "action_at"
  t.datetime "created_at"
  t.datetime "updated_at"
end

私はこれをしたいと思います:

users = User.limit(10)
ActiveRecord::Associations::Preloader.new(users, [:profile => :latest_action]).run 

またはこれ: User.includes(:profile => :latest_action).limit(10).all

ただし、これは失敗します。

User Load (0.9ms)  SELECT "users".* FROM "users" LIMIT 2
Profile Load (0.8ms)  SELECT "profiles".* FROM "profiles" WHERE "profiles"."user_id" IN (133622, 133623)
NoMethodError: undefined method `timezone' for #<Class:0x007fc5992152f8>

これは、単一のレコードを扱っているときに機能します。

User.last.profile.latest_action
User Load (0.8ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT 1
Profile Load (0.5ms)  SELECT "profiles".* FROM "profiles" WHERE "profiles"."user_id" = 242222 LIMIT 1
Action Load (0.6ms)  SELECT "actions".* FROM "actions" WHERE "actions"."profile_id" = 231220 AND (action_at <= '2013-08-27') ORDER BY action_at desc LIMIT 1

Proc を使用して has_one アソシエーションで動的条件を生成し、そのアソシエーションを ActiveRecord::Associations::Preloader 呼び出しで使用したり、インクルードを介して熱心にロードされたアソシエーションで使用したりできますか?

プリローダー/熱心な読み込みコンテキストでは、条件プロシージャの self はインスタンスではなくクラスのようです。

私はRails 3.2.13を使用しています

この ようにアソシエーションをロードできることはわかっていますが、それをプリローダーで使用することはできません

class Profile
  has_many :actions do
    def latest
      where("action_at <= ?", proxy_association.owner.timezone.now.to_date)
    end
  end
end
4

1 に答える 1