簡體   English   中英

Ruby on Rails 初學者問題:平等

[英]Ruby on Rails beginner question : equality

我開始了解 ROR,我正在寫一篇文章,等等……我做了這個代碼:

def show
 id = params[:id]
 list = Article.all
 is_valid = false

list.all.each do |article|
  if article.id == id
    @is_valid = true
    break
  end
end

如您所見,這段代碼只是想檢查文章 ID 是否存在。 所以我正在測試 id 和 article.id 之間的相等性(這是一個鏈接到數據庫中相應表的 model)但是當我嘗試使用或顯示 @is_valid boolean 時,我看到 article.id == id 每次都是 FALSE,即使 article.id = 2 和 id = 2。我試着去思考所有可能導致這種情況發生的事情,但我承認我仍然誤解了這一點。

然后我問你是否知道為什么會發生這種情況。 當然,像 2 == 2 這樣的等式會將 @is_valid 更改為 true。

謝謝您的幫助 !

也許是因為 params[:id] 它是一個字符串,而 article.id 它是一個 Integer

(byebug) params
{"controller"=>"admin/my_controller", "action"=>"edit", "id"=>"1"}

是的,它是......“id”是一個字符串“1”,所以你可以試試這個:


def show
 id = params[:id].to_i
 list = Article.all
 is_valid = false 

  list.all.each do |article|
    if article.id == id
      @is_valid = true
        break
      end
   end
end

也許可以工作。

這是您問題的答案,但是如果您想了解更多關於 Activerecord 的信息,您可以這樣做

Article.exists?(params[:id])

這將做你試圖做的只是對 db 的查詢。

如果你只想得到一篇簡單的文章

record = Article.find_by(id: params[:id]) #return nil when not exist
if record # if nil will threat like false on ruby
#my code when exist
else
#my code when not exist
end

將工作(您也可以使用 find 但 find 會在不存在時拋出異常 ActiveRecord::RecordNotFound ,因此您必須捕獲該異常。

Activerecord 有很多方法可以檢查這一點,您無需手動進行。

def show 
  @article = Article.find(params[:id])
end

這將創建一個返回單行的數據庫查詢。 如果沒有找到記錄, .find會引發ActiveRecord::NotFound異常。 Rails 捕捉到這個錯誤並顯示 404 頁面。 Article.find_by(id: params[:id])是不會引發的“安全”替代方案。

您的代碼有問題,因為list = Article.all將從數據庫中加載所有記錄,這很慢,如果您有足夠的文章,將耗盡服務器上的 memory。 它是解決任務的最不有效的方法。

如果您只想測試是否存在,請使用.exists? .any? . 這將創建一個COUNT查詢而不是選擇行。

Article.where(title: 'Hello World').exists?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM