class Auction < ActiveRecord::Base
include ApplicationHelper
belongs_to :product
belongs_to :image
has_many :bids
validates :product, :image, :min_price, :start_price, :start_time, :duration, :bid_time_step, :bid_price_step, presence: true
validates :duration, :bid_time_step, numericality: { only_integer: true }
validates :min_price, :start_price, :bid_price_step, numericality: { greater_than_or_equal_to: 0.01 }
validates :min_price, :start_price, :bid_price_step, fractionality: { multiplier: 0.01 }
after_initialize do
self.start_time = Time.now.round_by(15.minutes) if self.new_record? && self.start_time.nil?
end
before_create { |auction| auction.price = auction.start_price }
def self.finished_soon
# TODO: use PostgreSQL
Auction.all.select { |a| (a.time_left <= 5.seconds) && (a.time_left > 1.second) }
end
def started?
start_time < Time.now
end
def finished?
time_left < 0
end
def active?
started? && !finished?
end
def time_left
finish_time - Time.now
end
def start_in
start_time - Time.now
end
def finish_time
start_time + duration.seconds
end
def last_user
bids.sorted.last.user if bids.any?
end
def increase_price_and_time
self.price += self.bid_price_step
self.duration += self.bid_time_step
self.save!
end
def publish_updates
PrivatePub.publish_to '/auctions/update', auction_id: self.id, time_left: status_desc(self), price: self.price
end
end
On Tuesday, March 27, 2018 at 6:54:34 AM UTC-4, Allen Maxwell wrote:
It might help to have the models for auction and user... also, I like to add the annotate gem which gives some header comments in all my models to show what fields etc are there. Very helpful info and references.
you already know that the validate needs to be validates...
is this an active system or SUD? do you have a solid development database that is well populated to test/develop against?
other than that I'd have to see it in action to debug further.
Good luck
Max
On Monday, March 26, 2018 at 6:17:56 PM UTC-6, fugee ohu wrote:
This model has some errors that I wasn't able to get sorted out the two lines that begin with validate should be validates but after that I don't understand what the author's trying to do If I change them to validates I get the error Unknown validator: 'MessageValidator' for validate :auction_active?, message: :auction_active
class Bid < ActiveRecord::Base
belongs_to :auction
belongs_to :user
validates :auction, :user, presence: true
validate :auction_active?, message: :auction_active
validate :last_user_different?
scope :sorted, -> { order(:created_at) }
after_create :update_auction
private
def auction_active?
if auction && !auction.active?
if auction.finished?
errors.add(:auction, :finished)
else
errors.add(:auction, :not_started)
end
end
end
def last_user_different?
if auction && user
errors.add(:user, :same_user_twice) if auction.last_user == user
end
end
def update_auction
auction.increase_price_and_time
auction.publish_updates
end
end
class User < ActiveRecord::Base
has_many :authorizations
has_many :bids
has_one :avatar
belongs_to :role
has_many :permissions, through: :role
validates :nickname, presence: true
validates :nickname, uniqueness: { case_sensitive: false }
accepts_nested_attributes_for :avatar
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:omniauthable, omniauth_providers: [:facebook, :vkontakte]
before_create { |user| user.role = Role.default_role unless user.role }
scope :bots, -> { where(role: Role.bot) }
def self.random_bot
bots.order('RANDOM()').first
end
def admin?
role == Role.admin
end
def bot?
role == Role.bot
end
def self.find_for_oauth(auth)
authorization = Authorization.where(provider: auth.provider, uid: auth.uid.to_s).first
if authorization
user = authorization.user
else
email = auth.info[:email]
nickname = auth.info[:nickname]
user = User.where(email: email).first
if user
user.create_authorization(auth)
elsif email.present? && nickname.present?
password = Devise.friendly_token[0, 20]
user = User.create(email: email, password: password, password_confirmation: password, nickname: nickname)
user.create_authorization(auth)
end
end
user
end
def create_authorization(auth)
self.authorizations.create!(provider: auth.provider, uid: auth.uid)
end
def add_authorization(auth)
authorization = Authorization.where(provider: auth.provider, uid: auth.uid.to_s).first
if authorization
authorization.user == self
else
create_authorization(auth)
true
end
end
end