Ответ 1
На рельсах 3.2 я бы сделал
attributes = {}
Model.where(attributes).first_or_initialize
Документация http://apidock.com/rails/ActiveRecord/Relation/first_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)
На рельсах 3.2 я бы сделал
attributes = {}
Model.where(attributes).first_or_initialize
Документация http://apidock.com/rails/ActiveRecord/Relation/first_or_initialize
Учитывая большое количество полей, которые вы используете, вам, вероятно, лучше вручную найти запись и инициализировать ее, если она не существует:
attributes = {
country: country,
engine: engine,
power: power,
body: body
etc ...
}
record = where(attributes).first
record = new(attributes) unless record
Вы можете определить такой метод в своей модели
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})
при использовании 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