Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ruby on rails find_or_initialize

Is there any better way to achieve this in Ruby on Rails?

I'm searching for 11 fields and all are required also, and if not found initialize it.

There will be more required fields adding to it.

This query works perfect for me, but it just doesn't look like the best way to do this.

find_or_initialize_by_make_and_country_and_engine_and_power_and_body_and_doors_and_fuel_and_cylinders_and_transmission_and_gears_and_wheels(model,country,engine,power,body, doors, fuel, cylinders, transmission,gears,wheels)
like image 221
joe nayyar Avatar asked Sep 07 '12 14:09

joe nayyar


3 Answers

On rails 3.2 I would do

attributes = {}
Model.where(attributes).first_or_initialize

Documentation http://apidock.com/rails/ActiveRecord/Relation/first_or_initialize

like image 123
Filipe Giusti Avatar answered Nov 06 '22 19:11

Filipe Giusti


Considering the sheer number of fields you are using, you probably are better off manually finding the record and initializing it if it does not exist:

attributes = {
  country: country,
  engine: engine,
  power: power,
  body: body
  etc ...
}

record = where(attributes).first
record = new(attributes) unless record
like image 35
moger777 Avatar answered Nov 06 '22 18:11

moger777


You can define method like this in your model

def self.find_or_initialize_by_field(params)
    send("find_or_initialize_by_#{params.keys.join("_and_")}", *params.values)
end

and then you can call this method like

YourModel.find_or_initialize_by_field({country: country, engine: engine})
like image 2
Boat Pathompon Avatar answered Nov 06 '22 18:11

Boat Pathompon