我经常听说在测试Rails应用程序时使用.reload
很常见,但在实际的应用程序代码中呢?
下面的代码是有效的,但我一直在思考在这里使用.reload
是否有点粗糙。特别是因为我正在做的操作(通过helper方法add_passenger
添加到has_many
关系,调用rotate!
(看起来非常典型。
使用.reload
可以吗?或者有更好的方法来构建我的代码吗?
def organize
Driver.find_each(&:clear_space)
untaken = Rider.unassigned
open_drivers = Driver.available
# assume enough seats for all riders
while untaken.reload.size > 0
cur = untaken.first
open_drivers.reload.each do |driver|
if cur.prefers_strongest?(driver: driver)
driver.add_passenger(rider: cur)
end
end
untaken.rotate! if cur.car.nil?
end
Car.all
end
class Driver < Person
has_one :car, inverse_of: :driver, dependent: :destroy
delegate :riders, :riders_count, :clear_space, to: :car
after_create :create_car!
scope :available, -> { joins(:car).where('riders_count < ?', :total_space) }
def clear_space
riders.delete_all if riders_count > 0
end
def add_passenger(rider:)
riders << rider if car.has_space?
end
def remove_passenger(rider:)
riders.delete(rider) if riders.exists?(rider.id)
end
end
没有必要在顶级作用域上调用reload
。这些调用没有缓存。缓存的是那些通过ActiveRecord实例进行的调用。
在这种情况下,可以使用reload
丢弃整个记录上的缓存,也可以仅丢弃关联记录上的(如@user.rides.reload
(缓存。
#reload
实际上只是用来";刷新";或";重新干燥日期";一个记录或一组记录。因此,很难权威地说一个独立用户实际上只是一个通用工具,当需要数据库数据的第二个表示时可以使用。
但是的答案是,有更好的方法来构建我的代码吗