我使用money-rails gem来兑换货币。我有两个模型:用户和目标模型。 User模型有一个:currency
字段,money-rails使用该字段为用户设置货币。目标模型还有一个:currency
字段。就目前而言,当用户创建新目标时,控制器会将该目标的货币设置为与用户模型中存储的货币相同的值。
如下:
if @goal.save
@goal.update_attribute(:currency, current_user.currency)
redirect_to goals_path, notice: "Goal created!"
else
render '/goals/new'
end
但是,如果用户返回并通过编辑用户模型更改其货币,则仅更改此后创建的目标的货币。如何设置它以便在用户更改其货币时更改所有模型中使用的货币?
提前谢谢!
答案 0 :(得分:1)
一种方法是在User模型中使用after_save回调将更改级联到所有用户的目标:
class User < ActiveRecord::Base
has_many :goals
after_save :cascade_currency_changes
def cascade_currency_changes
if currency_changed?
goals.update_all currency: currency
end
end
end
答案 1 :(得分:0)
另一种方法是从目标模型中删除字段并拥有自定义字段:
class Goal < ActiveRecord::Base
belongs_to :user
#....
def currency
user.currency
end
end
所以,没有任何计算,总是:
@goal.currency == @goal.user.currency # => always true