这是 ruby/rails 发生在我身上最奇怪的事情。
我有一个模型,Store,它 has_many Balances。而且我有一种方法可以根据商店的货币为我提供默认余额。
店铺型号。
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
好的,那么在 Balance 控制器中我有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
现在这就是奇怪的部分来的地方......
如果我打电话给表演动作;例如:
获取 /api/stores/148/balances/default
返回null(因为货币被设置为null,并且没有Balance with null currency),生成的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
方法内部:
自我检查
它神奇地起作用了!!!
所以我不知道为什么会这样?......似乎商店对象在我“检查”它或类似的东西之前没有被加载。
谢谢