Search code examples
ruby-on-railse-commercerails-geocoder

How can I show product's price due to user's ip address


I'm building an e-commerce site, and I want to show product's price due to user's IP address. For getting the IP I use this code: current_user.current_sign_in_ip. To get the region of the IP address, I use this: Geocoder.search(current_user.current_sign_in_ip). My Product model is connected to a Currency model through a table ProductCurrency, where I store product_id, currency_id and 'price'.

class Product < ApplicationRecord
  belongs_to :category
  has_many :variants
  has_many :product_currencies
  has_many :currencies, through: :product_currencies
  accepts_nested_attributes_for :product_currencies, allow_destroy: true
  accepts_nested_attributes_for :variants, allow_destroy: true, reject_if: :all_blank
end

class Currency < ApplicationRecord
  has_many :product_currencies, dependent: :destroy
  has_many :products, through: :product_currencies
  has_many :currency_regions
  has_many :regions, through: :currency_regions
end

class ProductCurrency < ApplicationRecord
  belongs_to :product
  belongs_to :currency
end

So, my Product can have several currencies (EUR, USD) and prices (100 EUR, 150 USD). For a Currency model, I have a joining table called CurrencyRegion, where I store currency_id and region_id. And a related model called Region

class Region < ApplicationRecord
  has_many :currency_regions
  has_many :currencies, through: :currency_regions
end

class CurrencyRegion < ApplicationRecord
  belongs_to :currency
  belongs_to :region
end

So, what can I do to display product's price in USD if users IP address is from USA? Thanks ahead.


Solution

  • Please try below code:

    region = Geocoder.search(current_user.current_sign_in_ip)
    price  = ProductCurrency.
               joins(currency: :regions).
               where('regions.name = ?', region).
               pluck('product_currencies.price').
               first