如果存在则更新或如果不存在则创建 rails

Updating if exist or create if not rails

所以我使用 api 来获取天气信息,它每天都在执行,我想做的是如果已经存在则进行更新,如果不存在则创建一个新的 table。 我确实想在更新时更新所有属性。 我试过了

model = Model.where(column_name: value).first_or_initialize(locked: false)

但我收到一条错误消息:

unknown attribute locked for Model

raise UnknownAttributeError.new(self ,k.to_s)

如果您有任何需要,请询问,我会发表评论或编辑。我是 ruby 和 rails

的新手

首先参考文档here 具有以下属性 location: string temperature:integer wind:string 的天气名称 table 需要根据位置进行更新或初始化,其工作方式如下

 @weather_record = Weather.find_or_initialize_by(location: location_value)
 @weather.temperature = -60
 @weather.wind = strong
 @weather.save

接下来,永远不要使用模型的保留名称,因此不要将模型作为您的 table

的名称

最后在你的例子中

model.Model.where(column_name: value).first_or_initialize(locked: false)

你是说 a_record.ClassName.where 这是错误的,如果您使用的是 class 方法,则以 class 名称开头,例如Weather.where 如果您使用实例方法,则使用实例名称,例如an_instance_of_weather.some_field

首先,model.Model 部分应该只是 Model,因为 Model 是您的 class。

locked 应该是模型 class 的 column/attribute,尽管从您的错误来看似乎并非如此。因此,我将以 other_column_name 为例。

解释这是做什么的:

Model.where(column_name: value).first_or_initialize(other_column_name: some_value)

Model.where(column_name: value):获取满足条件column_name == value

的模型

first_or_initialize:如果找到 column_name == 值的模型,则返回该模型。否则,它会初始化一个模型 column_name = value.

通过传递 other_column_name: some_value,如果未找到模型并且需要初始化,它会将 other_column_name 设置为 some_value 但是:1) 它不会更新它,如果它是最初发现和 2) 它不保存记录。

保存新记录的 first_or_initialize 的等价物是 first_or_create 但如果记录已经存在,这仍然不会更新记录。

所以,你应该这样做:

m = Model.where(column_name: value).first_or_initialize
m.other_column_name = some_value
m.save

这样,您首先得到一个模型,其中 column_namevalue 或使用此值初始化一个新模型(如果它尚不存在)。然后,将属性 other_column_name 设置为 some_value 并保存模型。

一个 one-liner 替代方案是

Model.where(column_name: value).first_or_create.update(other_column_name: some_value)

但是请注意,如果需要创建它,这个将执行 2 个查询(插入和更新)。

关于错误的部分。它说锁定的属性在模型记录中不存在。这些 class 是您创建的吗?您正在使用某个 pre-existing 项目吗?您可以尝试发布 Model.attribute_names 和您的 schema.rb

试试这个伙伴:

column_name_value = (Way that you get the info from data)
model = Model.find_or_initialize_by column_name: column_name_value

如果有效请告诉我!