28

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

4 回答 4

78

在rails 3.2上我会做

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

文档http://apidock.com/rails/ActiveRecord/Relation/first_or_initialize

于 2013-05-14T18:21:36.963 回答
7

考虑到您正在使用的字段数量,您最好手动查找记录并在它不存在时对其进行初始化:

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

record = where(attributes).first
record = new(attributes) unless record
于 2012-09-07T17:30:05.050 回答
2

您可以在模型中定义这样的方法

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})
于 2013-04-01T17:01:19.680 回答
-2

使用时find_or_intialize_by

通过关键字段查找,不要一次分配所有字段

例如,我假设品牌是模型中的关键字段

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

于 2012-09-07T14:26:53.357 回答