在这里的一些人的帮助下,我正在使用此代码生成从我的应用程序购买的令牌。它根据订购的令牌数量进行循环,调用名为create_trackable_token
的方法,该方法只生成一个唯一的字符串来标识令牌。我有两个问题。
1)如何重写它以使特定的列不易受大规模分配的影响?现在,如果我在这个模型上使用'attr_accessible`,我必须在这个方法中公开三个属性,因为它一次分配它们。我宁愿不这样做。该方法已受到保护,因此最终用户无法调用该方法。
2)处理错误的最佳方法是什么?令牌必须是唯一的,而且现在,我不确定如果create_trackable_token
方法生成一个已经在使用的字符串会发生什么。 ActiveRecord
会处理这个问题,还是需要在方法中编写一些错误处理?
protected
def create_trackables
return unless self.success
order = Order.find(order_id) #you shouldn't need this line if it has_one :order
1.upto(order.total_tokens) do
Tracker.create!(
:user_id => order.user_id,
:token => Tracker.create_trackable_token,
:order_id => order_id
)
end
end
答案 0 :(得分:1)
要处理唯一性,请在列上使用验证,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#method-i-validates_uniqueness_of
创建令牌时,有很多事情需要考虑,比如你想要猜测它有多难(或者你是否用其他东西验证令牌?)......你可以使用哈希,比如屁股MD5,随机数,或者你可以全力以赴制作一个GUID。在任何情况下,您都可以在从create_trackable_token返回之前查找令牌。
Tracker.where(:token => generated_token).exists?
如果您希望保证质量分配的安全,您只需几步即可完成此操作:
t = Tracker.create( :user_id => order.user_id, :order_id => order_id ) t.token = Tracker.create_trackable_token t.save!