Class: Spree::ShippingMethod
- Includes:
- Discard::Model, CalculatedAdjustments, ParanoiaDeprecations
- Defined in:
- app/models/spree/shipping_method.rb
Overview
Represents a means of having a shipment delivered, such as FedEx or UPS.
Constant Summary collapse
- DISPLAY =
ActiveSupport::Deprecation::DeprecatedObjectProxy.new( [:both, :front_end, :back_end], "Spree::ShippingMethod::DISPLAY is deprecated", Spree::Deprecation )
Class Method Summary collapse
-
.available_for_address(address) ⇒ ActiveRecord::Relation
Shipping methods which are associated with zones matching the provided address.
-
.available_in_stock_location(stock_location) ⇒ ActiveRecord::Relation
Shipping methods which are available with the stock location or are marked available_to_all.
-
.with_all_shipping_category_ids(shipping_category_ids) ⇒ ActiveRecord::Relation
Shipping methods which are associated with all of the provided shipping categories.
Instance Method Summary collapse
- #build_tracking_url(tracking) ⇒ Object
- #display_on ⇒ Object
- #display_on=(value) ⇒ Object
-
#frontend? ⇒ Boolean
Some shipping methods are only meant to be set via backend.
- #include?(address) ⇒ Boolean
Methods included from CalculatedAdjustments
#calculator_type, #calculator_type=
Methods included from ParanoiaDeprecations
#paranoia_delete, #paranoia_destroy
Methods inherited from Base
display_includes, #initialize_preference_defaults, page, preference
Methods included from Preferences::Preferable
#admin_form_preference_names, #default_preferences, #defined_preferences, #get_preference, #has_preference!, #has_preference?, #preference_default, #preference_type, #set_preference
Class Method Details
.available_for_address(address) ⇒ ActiveRecord::Relation
Returns shipping methods which are associated with zones matching the provided address.
89 90 91 |
# File 'app/models/spree/shipping_method.rb', line 89 def self.available_for_address(address) joins(:zones).merge(Zone.for_address(address)) end |
.available_in_stock_location(stock_location) ⇒ ActiveRecord::Relation
Returns shipping methods which are available with the stock location or are marked available_to_all.
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'app/models/spree/shipping_method.rb', line 67 def self.available_in_stock_location(stock_location) smsl_table = Spree::ShippingMethodStockLocation.arel_table # We are searching for either a matching entry in the stock location join # table or available_to_all being true. # We need to use an outer join otherwise a shipping method with no # associated stock locations will be filtered out of the results. In # rails 5 this will be easy using .left_join and .or, but for now we must # use arel to achieve this. arel_join = arel_table.join(smsl_table, Arel::Nodes::OuterJoin). on(arel_table[:id].eq(smsl_table[:shipping_method_id])). join_sources arel_condition = arel_table[:available_to_all].eq(true).or(smsl_table[:stock_location_id].eq(stock_location.id)) joins(arel_join).where(arel_condition).distinct end |
.with_all_shipping_category_ids(shipping_category_ids) ⇒ ActiveRecord::Relation
Returns shipping methods which are associated with all of the provided shipping categories.
50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'app/models/spree/shipping_method.rb', line 50 def self.with_all_shipping_category_ids(shipping_category_ids) # Some extra care is needed with the having clause to ensure we are # counting distinct records of the join table. Otherwise a join could # cause this to return incorrect results. join_table = Spree::ShippingMethodCategory.arel_table having = join_table[:id].count(true).eq(shipping_category_ids.count) subquery = joins(:shipping_method_categories). where(spree_shipping_method_categories: { shipping_category_id: shipping_category_ids }). group('spree_shipping_methods.id'). having(having) where(id: subquery.select(:id)) end |
Instance Method Details
#build_tracking_url(tracking) ⇒ Object
100 101 102 103 |
# File 'app/models/spree/shipping_method.rb', line 100 def build_tracking_url(tracking) return if tracking.blank? || tracking_url.blank? tracking_url.gsub(/:tracking/, ERB::Util.url_encode(tracking)) # :url_encode exists in 1.8.7 through 2.1.0 end |
#display_on ⇒ Object
105 106 107 108 109 110 111 |
# File 'app/models/spree/shipping_method.rb', line 105 def display_on if available_to_users? "both" else "back_end" end end |
#display_on=(value) ⇒ Object
114 115 116 |
# File 'app/models/spree/shipping_method.rb', line 114 def display_on=(value) self.available_to_users = (value != "back_end") end |
#frontend? ⇒ Boolean
Some shipping methods are only meant to be set via backend
120 121 122 |
# File 'app/models/spree/shipping_method.rb', line 120 def frontend? available_to_users? end |
#include?(address) ⇒ Boolean
93 94 95 96 97 98 |
# File 'app/models/spree/shipping_method.rb', line 93 def include?(address) return false unless address zones.any? do |zone| zone.include?(address) end end |