current_user
current_user

Reputation: 1202

Initializing objects of a model

This command:

rails g model Product name quantity:integer

generates a model Product with two fields: name, which is a string, and quantity, which is an integer.

  1. Are the fields instance variables of Product?
  2. If so, when and where and how are they initialized?
  3. When creating a Product instance in a controller:

eg:

    def new
      @product = Product.new
    end

where is the initialize method called?

Upvotes: 0

Views: 81

Answers (2)

jvillian
jvillian

Reputation: 20263

To be a little more precise...

When you do:

rails g model Product name quantity:integer

You are not adding a product table to your database. You are creating a migration and a model (and perhaps some tests, depending...). You'll see something like:

  invoke  active_record
  create    db/migrate/20171129070104_create_products.rb
  create    app/models/product.rb

When you do:

rake db:migrate

THEN you're adding a table to your database. You'll see something like:

== 20171129070623 CreateProducts: migrating ==============
-- create_table(:products)
   -> 0.0179s
== 20171129070623 CreateProducts: migrated (0.0180s) =====

Once migrated, your products table will have columns named name and quantity.

To your questions:

Are the fields instance variables of Product?

Roughly, yes. An instance of Product will have attributes for name and quantity. So, if you do (in console):

p = Product.new

You will see:

> p = Product.new
 => #<Product id: nil, name: nil, quantity: nil, created_at: nil, updated_at: nil>

If so, when and where are they initialized?

Instance attributes are initialized when calling new on a model class. If you call new with no arguments, then the attributes are initialized to nil.

You can also call new with arguments, such as:

> Product.new(name: 'foo', quantity: 2)
 => #<Product id: nil, name: "foo", quantity: 2, created_at: nil, updated_at: nil>

Where are they initialized? Anywhere you want. There are varying ideas about practices that are "good" and practices that are "bad". But, that's a much longer discussion.

Personally, I never interact (e.g., initialize, save, update, delete) with my models in my controllers or views. I have a custom class called managers and that is the only place I interact with my models. But, I am very odd in this regard and you should consider my practice "anomalous".

When a creating a Product instance in a controller, where is the initialize method called?

As pointed out elsewhere, it is called when new is called. There are some subtleties, and you might want to look into ActiveRecord::Callbacks.

Also, as pointed out elsewhere, you can override initialize for any number of reasons.

By the way, new and initialize are not unique to models. It is very common to use them in plain old ruby objects.

Upvotes: 1

user8359150
user8359150

Reputation:

When you do: rails g model Product name quantity:integer.

What you are really doing is adding a product table to your database and adding a product model to your models. (And some other things that aren't largely important.) You are not creating an instance. However if you were to go to add to you table that you've just creating that would be initializing; and that usually happens in the following places: in your console, in your seed file, in your tests, in the browser, and sometimes in other models and controllers.

Last note, when you initialize a new product you don't to make your own new method. Ruby already has taken care of that for you. Just initialize like - product = Product.new

You can if you so choose to have an initialize method which will do certain things with information that is passed in, namely make it available for the other methods to use. But I'll let you read up on that. Mostly, if you're developing using ruby on rails you probably wont need initialize.

Upvotes: 1

Related Questions