Uncaching some parts and adding specs

This commit is contained in:
Will Marshall
2014-07-10 14:49:21 +10:00
parent f57e8513d5
commit 26e8a1fd91
4 changed files with 59 additions and 16 deletions

View File

@@ -9,15 +9,17 @@ class ShopController < BaseController
def products
# Can we make this query less slow?
unless @products = current_order_cycle.andand
#
if @products = current_order_cycle.andand
.valid_products_distributed_by(current_distributor).andand
.select { |p| !p.deleted? && p.has_stock_for_distribution?(current_order_cycle, current_distributor) }.andand
.sort_by {|p| p.name }
render status: 200,
json: ActiveModel::ArraySerializer.new(@products, each_serializer: Api::ProductSerializer,
current_order_cycle: current_order_cycle, current_distributor: current_distributor).to_json
else
render json: "", status: 404
end
render status: 200,
json: ActiveModel::ArraySerializer.new(@products, each_serializer: Api::ProductSerializer,
current_order_cycle: current_order_cycle, current_distributor: current_distributor).to_json
end
def order_cycle

View File

@@ -1,12 +1,35 @@
class Api::ProductSerializer < ActiveModel::Serializer
# TODO
# Prices can't be cached? How?
def serializable_hash
cached_serializer_hash.merge uncached_serializer_hash
end
private
def cached_serializer_hash
Api::CachedProductSerializer.new(object, @options).serializable_hash
end
def uncached_serializer_hash
Api::UncachedProductSerializer.new(object, @options).serializable_hash
end
end
class Api::UncachedProductSerializer < ActiveModel::Serializer
attributes :price
def price
object.master.price_with_fees(options[:current_distributor], options[:current_order_cycle])
end
end
class Api::CachedProductSerializer < ActiveModel::Serializer
cached
delegate :cache_key, to: :object
attributes :id, :name, :permalink, :count_on_hand, :on_demand, :group_buy,
:notes, :description, :price
:notes, :description
has_many :variants, serializer: Api::VariantSerializer
has_many :taxons, serializer: Api::IdSerializer
@@ -15,8 +38,4 @@ class Api::ProductSerializer < ActiveModel::Serializer
has_one :supplier, serializer: Api::IdSerializer
has_one :primary_taxon, serializer: Api::TaxonSerializer
has_one :master, serializer: Api::MasterVariantSerializer
def price
object.master.price_with_fees(options[:current_distributor], options[:current_order_cycle])
end
end

View File

@@ -1,8 +1,31 @@
class Api::VariantSerializer < ActiveModel::Serializer
attributes :id, :is_master, :count_on_hand, :name_to_display, :unit_to_display, :on_demand, :price
has_many :images, serializer: Api::TaxonImageSerializer
def serializable_hash
cached_serializer_hash.merge uncached_serializer_hash
end
def price
0.0
private
def cached_serializer_hash
Api::CachedVariantSerializer.new(object, @options).serializable_hash
end
def uncached_serializer_hash
Api::UncachedVariantSerializer.new(object, @options).serializable_hash
end
end
class Api::UncachedVariantSerializer < ActiveModel::Serializer
attributes :price
def price
object.price_with_fees(options[:current_distributor], options[:current_order_cycle])
end
end
class Api::CachedVariantSerializer < ActiveModel::Serializer
cached
delegate :cache_key, to: :object
attributes :id, :is_master, :count_on_hand, :name_to_display, :unit_to_display, :on_demand
has_many :images, serializer: Api::TaxonImageSerializer
end

View File

@@ -142,11 +142,10 @@ describe ShopController do
end
it "includes the primary taxon" do
taxon = mock_model(Spree::Taxon, name: "fruitbat")
taxon = create(:taxon)
Spree::Product.any_instance.stub(:primary_taxon).and_return taxon
taxon.stub_chain(:icon, :url).and_return ""
xhr :get, :products
response.body.should have_content "fruitbat"
response.body.should have_content taxon.name
end
end
end