如果存在则更新或如果不存在则创建 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_name
是 value
或使用此值初始化一个新模型(如果它尚不存在)。然后,将属性 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
如果有效请告诉我!
所以我使用 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_name
是 value
或使用此值初始化一个新模型(如果它尚不存在)。然后,将属性 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
如果有效请告诉我!