Я использую Rails 5. У меня есть следующие моделиКак мне заставить мою модель использовать мой кеш при сохранении?
class MyObject < ActiveRecord::Base
...
belongs_to :distance_unit
...
def save_with_location
transaction do
address = LocationHelper.get_address(location)
if !self.address.nil? && !address.nil?
self.address.update_attributes(address.attributes.except("id", "created_at", "updated_at"))
elsif !address.nil?
address.race = self
address.save
end
# Save the object
save
end
end
Через некоторое хитрого отладки, я понял, что «сохранить» метод вызывает этот запрос будет выполнен ...
DistanceUnit Load (0.3ms) SELECT "distance_units".* FROM "distance_units" WHERE "distance_units"."id" = $1 LIMIT $2 [["id", 2], ["LIMIT", 1]]
↳ app/models/my_object.rb:54:in `block in save_with_location'
Это heppens каждый раз, когда вызывается вышеупомянутый метод. это не оптимально, потому что я установил мою модель DistanceUnit для хранения кеша. Ниже приведен код. Как я могу получить метод «сохранить», чтобы автоматически использовать кеш, а не выполнять этот запрос каждый раз?
class DistanceUnit < ActiveRecord::Base
def self.cached_find_by_id(id)
Rails.cache.fetch("distanceunit-#{id}") do
puts "looking for id: #{id}"
find_by_id(id)
end
end
def self.cached_find_by_abbrev(abbrev)
Rails.cache.fetch("distanceunit-#{abbrev}") do
find_by_abbrev(abbrev)
end
end
def self.cached_all()
Rails.cache.fetch("distanceunit-all") do
all
end
end
end
Вы используете это в разработке или производстве? – Iceman
Я провел тест выше в разработке, но это происходит и в производстве. – Dave
Вы можете включить отношения для distance_unit и my_object? –