Why would you want to return false from a callback and still destroy it? I
think you might try to squeeze two different concepts into a single method
definition: if you want to check whether or not price is lower than
something and actually USE that information somewhere else, then just
create another method "low_price?", and you can use it in "low_price"
callback:

def low_price
  if low_price?
    # do something before the record is destroyed
  end
  true
end

def low_price?
  price <= 100
end

2012/8/20 Panayotis Matsinopoulos <[email protected]>

> Hi,
>
> I am wondering whether this is the designed behavior of ActiveRecord,
> when, to me, it is not the expected one.
>
> I have a simple model design with an Order having many Order Items and an
> Order Item belonging to an Order. The has_many association on Order has a
> :dependent => :destroy option.
> Also, the Order Item has a before_destroy function that would check the
> price of the Order Item. If the price is above 100, it returns false and
> does not allow the Order Item to be destroyed.
>
> The classes codes has as follows:
>
> class Order < ActiveRecord::Base
>   attr_accessible :order_code
>   has_many :order_items, :inverse_of => :order, :dependent => :destroy
> end
>
> class OrderItem < ActiveRecord::Base
>   attr_accessible :price, :order_id
>
>   belongs_to :order, :inverse_of => :order_items
>
>   before_destroy :low_price
>
>   protected
>
>   def low_price
>     if price <= 100
>       puts "I have low price...I can be deleted"
>       true
>     else
>       puts "I have high price...I cannot be deleted"
>       false
>     end
>   end
> end
>
> The problem is that when I am issuing a destroy on an instance of an order
> that has an order item that has price > 100, then the order item is not
> deleted, but the order does. Here are the console commands and output:
>
> > rails c
> Loading development environment (Rails 3.2.8)
> 1.9.3-p194 :001 > o = Order.new :order_code => 'first order'
>  => #<Order id: nil, order_code: "first order", created_at: nil,
> updated_at: nil>
> 1.9.3-p194 :002 > o.save!
>    (0.1ms)  BEGIN
>   SQL (0.2ms)  INSERT INTO `orders` (`created_at`, `order_code`,
> `updated_at`) VALUES ('2012-08-20 08:14:20', 'first order', '2012-08-20
> 08:14:20')
>    (2.0ms)  COMMIT
>  => true
> 1.9.3-p194 :003 > o.order_items << OrderItem.new(:price => 110)
>    (0.1ms)  BEGIN
>   SQL (0.3ms)  INSERT INTO `order_items` (`created_at`, `order_id`,
> `price`, `updated_at`) VALUES ('2012-08-20 08:14:31', 5, 110, '2012-08-20
> 08:14:31')
>    (0.5ms)  COMMIT
>   OrderItem Load (0.3ms)  SELECT `order_items`.* FROM `order_items` WHERE
> `order_items`.`order_id` = 5
>  => [#<OrderItem id: 4, order_id: 5, price: 110, created_at: "2012-08-20
> 08:14:31", updated_at: "2012-08-20 08:14:31">]
> 1.9.3-p194 :004 > o.destroy
>    (0.2ms)  BEGIN
> I have high price...I cannot be deleted
>   SQL (1.0ms)  DELETE FROM `orders` WHERE `orders`.`id` = 5
>    (1.8ms)  COMMIT
>  => #<Order id: 5, order_code: "first order", created_at: "2012-08-20
> 08:14:20", updated_at: "2012-08-20 08:14:20">
> 1.9.3-p194 :005 >
>
>
> Can somebody explain to me, why the failure of the dependent object
> destroy method does not trigger a rollback?
>
> Thanks in advance
> Panayotis
>
>  --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Talk" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msg/rubyonrails-talk/-/tYWGJ6euWZQJ.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to