Question about a model example

25 views
Skip to first unread message

Agis A.

unread,
Jan 17, 2012, 6:47:53 AM1/17/12
to rubyonra...@googlegroups.com
I'm a beginner to both Ruby and Rails and I'm currently reading the Agile development with Rails, in which I'm currently developing the cart of the store.

I have a line_items model which belongs_to :products. This makes sense. Later in the example we use this code to check if a product is referenced by any line items before we destroy it:

class Product < ActiveRecord::Base
  has_many :line_items
  before_destroy :ensure_not_referenced_by_any_line_item
  private
    # ensure that there are no line items referencing this product
    def ensure_not_referenced_by_any_line_item
      if line_items.empty?
        return true
      else
        errors.add(:base, 'Line Items present')
        return false
      end
    end
end

This makes sense to me except of one part: if line_items.empty? I can only guess that line_items returns all the rows of the "line_items" table that contain the product.id of the currently instantiated Product object, is that right? But how does the model knows what to fetch just by "line_items"? Isn't that too little info that we give to our model, regarding the logic of the task it has to do? Don't we have to declare somewhere something like: return false if line_items.product.id == product.id ?

Thanks in advance people!

Colin Law

unread,
Jan 17, 2012, 6:56:57 AM1/17/12
to rubyonra...@googlegroups.com

The fact that you have said has_many :line_items automatically makes a
method line_items available for any product that returns an array
(actually it is not strictly an array, but near enough) containing all
the line items for that product.

Similarly if you have a line item in @line_item then you can say
@line_item.product to get the associated product.

Have a look at the Rails Guide on ActiveRecord associations to find
all the methods that rails makes available.

Colin

Agis A.

unread,
Jan 17, 2012, 7:05:33 AM1/17/12
to rubyonra...@googlegroups.com
I see.

Now I've upgraded my seeds.rb file, to add some entry into the line_items table and see how it works.
Actually I've added this line: LineItem.create (product_id: '8', cart_id: '1')

but when I run rake db:seed I get this error: 

rake db:seed
rake aborted!
/rails/depot/db/seeds.rb:55: syntax error, unexpected tLABEL
LineItem.create (product_id: 8, cart_id: 1)
                             ^

My migration file for LineItems table is this:
class CreateLineItems < ActiveRecord::Migration
  def change
    create_table :line_items do |t|
      t.integer :product_id
      t.integer :cart_id
      t.timestamps
    end
  end
end

Peter Vandenabeele

unread,
Jan 17, 2012, 7:07:48 AM1/17/12
to rubyonra...@googlegroups.com
On Tue, Jan 17, 2012 at 1:05 PM, Agis A. <corestu...@gmail.com> wrote:
I see.

Now I've upgraded my seeds.rb file, to add some entry into the line_items table and see how it works.
Actually I've added this line: LineItem.create (product_id: '8', cart_id: '1')

but when I run rake db:seed I get this error: 

rake db:seed
rake aborted!
/rails/depot/db/seeds.rb:55: syntax error, unexpected tLABEL
LineItem.create (product_id: 8, cart_id: 1)

Remove the space before the '('

  LineItem.create(product_id: 8, cart_id: 1)

In newer versions of Ruby (1.9.3 and maybe earlier), this is not longer allowed.

Peter

Agis A.

unread,
Jan 17, 2012, 7:29:59 AM1/17/12
to rubyonra...@googlegroups.com, pe...@vandenabeele.com
Thank you! Silly me for missing that.
Reply all
Reply to author
Forward
0 new messages