gpt4 book ai didi

ruby-on-rails - 在哪里使用 find_or_create_by 方法?

转载 作者:行者123 更新时间:2023-12-03 15:01:04 27 4
gpt4 key购买 nike

当使用 Rails 方法 find_or_create_by 时,它属于模型还是 Controller ?我很难理解如何实际实现此方法。

我希望我的 Rails 应用程序接受来自用户的 JSON 消息。用户会将数据发送回服务器,以便将其保存在数据库中。也就是说,我假设用户必须使用“POST”或“PATCH”方法来存储或更新我服务器上的数据。当我查看我的路线时,创建操作使用“POST”方法。

我已阅读以下 Rails 文档,但它没有向我阐明任何内容。 http://guides.rubyonrails.org/active_record_querying.html#find-or-create-by

我会像这样在创建操作中放置 find_or_create_by 方法吗?还是它属于其他地方?它在创建操作中似乎不正确...

class WifiNetworksController < ApplicationController
def create
@wifi_network = WifiNetwork.find_or_create_by(bssid: params[:bssid],
ssid: params[:ssid],
channel: params[:channel], etc...)
end
end

最终我想要:

  1. 用户通过 JSON 保存新网络(如果不存在)
  2. 如果某些属性有所改善(例如信号强度),用户可以通过 JSON 更新现有网络

感谢您的宝贵时间!

最后更新 - 感谢大家的宝贵建议!我不得不听取大家的一些建议才能让它发挥作用!下面是我最终所做的。似乎运行良好,没有错误。

def create
respond_to do |format|
if @wifi_network = WifiNetwork.find_by(bssid: wifi_network_params[:bssid])
# Logic for checking whether to update the record or not
@wifi_network.update_attributes(wifi_network_params) if @wifi_network.rssi < params[:rssi]
format.json { render :nothing => true }
else
# Must be a new wifi network, create it
@wifi_network = WifiNetwork.create(wifi_network_params)
format.json { render :nothing => true }
end
end
end

最佳答案

如果你使用强参数,你可以在你的 Controller 中这样做:

def create
@wifi_network = WifiNetwork.find_or_create_by(bssid: wifi_network_params[:bssid])
@wifi_network.update_attributes(wifi_network_params)
end

然后当用户像这样 curl 时:

 curl -X POST localhost:3000/wifi_networks -d "wifi_network[bssid]=bssid1&wifi_network[ssid]=ssid1&wifi_network[channel]=channel1"

您的创建操作将通过它的 bssid 查找 WifiNetwork 并更新 ssid 和 channel 属性,或者如果它不存在,它将使用 bssid 参数创建一个 WifiNetwork,然后使用其余的更新新创建的记录属性。要小心,因为如果其他属性的 wifi_network_params 为空,它们会将参数更新为 nil。

关于ruby-on-rails - 在哪里使用 find_or_create_by 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23529515/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com