Вопрос для начинающих в Ruby on Rails: равенство - PullRequest
0 голосов
/ 11 ноября 2019

Я начинаю знать 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 и article.id (модель, связанная с соответствующей таблицей в базе данных), НО, когда я пытаюсь использовать или отображать логическое значение @is_valid, я вижу, что article.id == id каждый раз имеет значение FALSE,даже если article.id = 2 и id = 2. Я пытался думать обо всем, что может сделать это, но я признаю, что все еще неправильно понимаю.

Тогда я спрашиваю вас, знаете ли вы, почему это происходит. Конечно, равенство типа 2 == 2 изменит @is_valid на true.

Спасибо за помощь!

Ответы [ 2 ]

4 голосов
/ 11 ноября 2019

Возможно, потому что params [: id] это строка, а article.id это целое число

(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 имеет много способов проверить это, вам не нужно делать это вручную.

1 голос
/ 12 ноября 2019
def show 
  @article = Article.find(params[:id])
end

Это создаст запрос к базе данных, который вернет одну строку. .find вызывает исключение ActiveRecord::NotFound, если запись не найдена. Rails ловит эту ошибку и показывает страницу 404. Article.find_by(id: params[:id]) - это «безопасная» альтернатива, которая не возникает.

Ваш код проблематичен, так как list = Article.all будет загружать все записи из базы данных, что является медленным и приведет к исчерпанию памяти на сервере, если выесть достаточно статей. Это наименее эффективный способ решения задачи.

Если вы хотите просто проверить существование, используйте .exists? или .any?. Это создает запрос COUNT вместо выбора строк.

Article.where(title: 'Hello World').exists?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...