Rails after_validation or before_save

I dont think i used after_validation ever as before_save(or similar callbacks like before_create or update) is the one which fits. Usually the flow is

Screen Shot 2018-08-03 at 1.45.57 PM

before_save seems to be the last step in the process and by the time it reaches there the record is valid. Like you wanted it to happen every time when validation is successful.

after_validation is called irrespective of the validation failed or not. I cant think of a scenario where you want to use it.

We cannot substitute after_validation for before_save as we can not guarantee that the record is always going to be valid.

Git merge vs rebase

There is no hard and fast rule. But i am putting out when to use what based on my experience.

Merge if

  • you are in a big team working on a feature branch and you want to rebased from master. If you dont have all the commits you are in trouble.
  • When you find rebasing is becoming painful for no reason. like for every rebase step you need to fix the same lines of code again and again.
  • Not worried about one more additional commit and order of commits as they are going to be mixed up.

Rebase if

  • you dont want to change the commit history/log.
  • You want the commit history looks clean. As new work will be on top of everything.
  • when you have less code changes or you know how to deal with conflicts (more patience required practice meditation).
  • you branched off of feature branch to your own branch. You can do what ever you want as its your world.

ActiveRecord::EagerLoadPolymorphicError: Cannot eagerly load the polymorphic association

 

If you have encountered this error and wondering how to fix it this post is for you.

Rails raises this error when it tries to eager load a polymorphic association using a JOIN.

For example i have a Booking which belongs_to polymorphic association order. An Order can be a PickupOrder or DeliveryOrder

class Booking < ApplicationRecord
  belongs_to :order, polymorphic: true
end
class PickupOrder < ApplicationRecord
  has_many :bookings, as: :order, dependent: :destroy, inverse_of: :order
end
class DeliveryOrder < ApplicationRecord
  has_many :bookings, as: :order, dependent: :destroy, inverse_of: :order
end

I can load all bookings along with orders like this

Booking.includes(:order)

Now if I want to search list of bookings by `order_name` like `ja`

Booking.includes(:order).references(:order).where("order.order_name ilike %ja%")

Throws the error

​​ActiveRecord::EagerLoadPolymorphicError: Cannot eagerly load the polymorphic association :order

Solution: Do it in sql. with left outer joins.

Booking.joins("left outer join delivery_orders on delivery_orders.id = bookings.order_id and bookings.order_type='DeliveryOrder'").
        joins("left outer join pickup_orders on pickup_orders.id = bookings.order_id and bookings.order_type='PickupOrder'").
        where("pickup_orders.order_name like '%ja%' or delivery_orders.order_name like '%ja%'")

Happy coding!