Подтвердить что ты не робот

Ruby on rails find_or_initialize

Есть ли лучший способ добиться этого в Ruby on Rails?

Я ищу 11 полей, и все они также необходимы, и если они не найдены, инициализируйте их.

В него добавятся дополнительные поля.

Этот запрос работает идеально для меня, но он просто не похож на лучший способ сделать это.

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)
4b9b3361

Ответ 2

Учитывая большое количество полей, которые вы используете, вам, вероятно, лучше вручную найти запись и инициализировать ее, если она не существует:

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

record = where(attributes).first
record = new(attributes) unless record

Ответ 3

Вы можете определить такой метод в своей модели

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

а затем вы можете вызвать этот метод, например

YourModel.find_or_initialize_by_field({country: country, engine: engine})

Ответ 4

при использовании find_or_intialize_by

найти по ключевым полям, не назначать сразу все feilds

Например, я предполагаю, что make является ключевым полем в модели

car = find_or_initialize_by_make(model)

car.update_attributes(country: country,engine: engine,power: power, body: body,doors: doors ,fuel: fuel,cylinders:cylinders,transmission: transmission, gears: gears, wheels: wheels)

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Dynamic+attribute-based+finders