これは、Ruby/Railsでこれまでに起こった中で最も奇妙なことです。
私はモデルStoreを持っています。これはhas_manyBalancesです。そして、ストアの通貨に基づいてデフォルトの残高を取得する方法があります。
店舗モデル。
class Store < ActiveRecord::Base
has_many :balances, as: :balanceable, dependent: :destroy
def default_balance
#puts self.inspect <- weird part.
balances.where(currency: self.currency)[0]
end
...
end
バランスモデル。
class Balance < ActiveRecord::Base
belongs_to :balanceable, :polymorphic => true
...
end
では、バランスコントローラーにshowアクションがあります。これにより、特定のバランスまたはデフォルトのバランスが得られます。
バランスコントローラー。
class Api::Stores::BalancesController < Api::Stores::BaseController
before_filter :load_store
# Returns a specific alert
# +URL+:: GET /api/stores/:store_id/balances/:id
def show
#puts @store.inspect <- weird part.
@balance = (params[:id] == "default") ? @store.default_balance : Balance.find(params[:id])
respond_with @balance, :api_template => :default
end
...
private
# Provides a shortcut to access the current store
def load_store
@store = Store.find(params[:store_id])
authorize! :manage, @store
end
end
ここで奇妙な部分が発生します...
ショーアクションを呼び出すと、例えば:
GET / api /stores/148/balances/default
nullを返し(通貨がnullに設定されていて、null通貨との残高がないため)、生成されるSQLクエリは次のとおりです。
SELECT `balances`.* FROM `balances` WHERE `balances`.`balanceable_id` = 148 AND `balances`.`balanceable_type` = 'Store' AND `balances`.`currency` IS NULL
だから私は理由がわかりません...それは通貨をNULLとして設定しています。しかし、そのプロセスのどこかに私が置いた場合
@store.inspectを置きます
またはdefault_balance
メソッド内:
self.inspectを置きます
それは魔法のように機能します!!!。
それで、なぜそれが起こっているのかわかりませんか?...ストアオブジェクトを「検査」するまで、ストアオブジェクトがロードされていないようです。
ありがとう