Gridens - информационные технологии

Столбец запроса для дубликата из переменной

Я хочу проверить, существует ли уже строка в столбце таблицы. Имя столбца представлено в виде строки, @language = 'german', имя столбца — на немецком языке.

Word.where(@language: string).empty?

Так что я хочу, чтобы это сделать

Word.where(german: string).empty?

Как я могу использовать @language в предложении where?


  • хотя мне нравится ответ @papirtiger, вы также можете использовать интерполяцию, которая может быть еще быстрее (не планируя ее скамейки), вот так Word.where("#{@language}" => string) 19.05.2015

Ответы:


1
Word.where(Hash[@language, string]).exists?

Hash[@language, string] — один из тех красивых рубизмов, которые динамически создают хэш.

irb(main):005:0> @language = 'german'
=> "german"
irb(main):006:0> string = 'kummerspeck'
=> "kummerspeck"
irb(main):007:0> Hash[@language, string]
=> {"german"=>"kummerspeck"}
19.05.2015
  • Этот метод обрабатывается быстрее всего, поэтому я выбрал его. 19.05.2015
  • Не думайте - проверьте мой ответ. 19.05.2015

  • 2

    Вы можете использовать exists?:

    Word.exists?(@language => string)
    

    Проблема, с которой вы столкнулись, заключается в том, что синтаксис @language: string на самом деле означает :@language => string.

    Не думайте, что это будет медленнее:

    require 'benchmark'    
    @language = 'english'
    string = 'Hello world'
    
    Benchmark.bm do |x|
      x.report { 100000.times { a = Hash[@language, string] } }
      x.report { 100000.times { a = { @language => string } } }
    end
    

    распечатывает

        user     system      total        real
    0.100000   0.040000   0.140000 (  0.143954)
    0.050000   0.000000   0.050000 (  0.050434)
    

    на моей машине.

    Интересно, что на моей машине это выглядит так: .where().exists? быстрее, чем .exists? самостоятельно:

    require 'benchmark'
    column = 'last_name'
    value = 'Jones'
    
    Benchmark.bm do |x|
      x.report { 10000.times { User.exists?(column => value) } }
      x.report { 10000.times { User.where(column => value).exists? } }
    end
    
    19.05.2015
  • Язык столбца отсутствует: Неизвестный столбец «words.language» в … столбец «words.german», но может быть «words.chinese» на основе строки. 19.05.2015
  • Ааа, не понял этого из твоего описания. Обновлено. 19.05.2015
  • Хорошее объяснение, имеет смысл. Способ Hash быстрее в моих журналах. Гораздо быстрее, так что я собираюсь использовать это. 19.05.2015
  • Отлично, спасибо за бенчмарк. Я попробовал это с помощью Benchmark. бмбм. Удивительно, но "#{@language}" => string на самом деле незначительно быстрее. 19.05.2015
  • Надеюсь, это в пределах погрешности, потому что это не имеет смысла. 19.05.2015
  • Странный. Я не понимаю. 19.05.2015
  • Вы должны проверить скорость с помощью запроса с таблицей, содержащей не менее 10 000 записей. 19.05.2015

  • 3

    Может варьироваться в зависимости от базы данных, динамические столбцы не рекомендуются, кстати.

    Word.where("#{@langauge} IS NULL")
    
    19.05.2015
  • да, иногда проще 19.05.2015
  • Это опасно в зависимости от того, откуда @language. то есть если это 1=1; УДАЛИТЬ ОТ пользователей; -- 19.05.2015
  • Абсолютно, я предполагаю, что это фиксированный список. И во всех ответах имя столбца никогда не может быть нулевым и всегда должно существовать в базе данных. Бонусные баллы за ответ, который изящно справляется с этим. 19.05.2015

  • 4

    Вы можете использовать column_names, чтобы вернуть все имя поля столбца таблицы

    Word.column_names.include?(@language)

    19.05.2015
  • Word.column_names — это массив, в который входят? не определено 19.05.2015
  • Этот ответ наполовину завершен - это довольно хорошая идея о том, как убедиться, что столбец существует, но не включает фактический запрос. Вы могли бы использовать это так. Word.where(Hash[@language, string]).exists? if Word.column_names.include?(@language) 19.05.2015
  • или вы могли бы использовать его как ..Word.column_names.include?(@language) && Word.where(Hash[@language, string]).exists? 19.05.2015
  • @papirtiger Я вижу, язык var определен в бэкэнде, поэтому я не беспокоюсь о проверке. 19.05.2015
  • Новые материалы

    Журналы Py № 2: Если, Элиф, Иначе?
    У меня такое чувство, будто я давно ничего не писал, хотя прошло два дня с тех пор, как я опубликовал свою первую историю. В любом случае, сегодня произошло много всего, так что приступим...

    Работа в Реакции
    Я изучаю React в Bloc прямо сейчас. До сих пор я изо всех сил пытался понять темы. Тем не менее, я только что закончил проблему, над которой некоторое время размышлял, и хочу записать свой..

    Нужен ли банкам искусственный интеллект, чтобы кардинально изменить свою работу?
    Почему необходимо использовать искусственный интеллект в банковской сфере? Существенное использование многочисленных инноваций ИИ, таких как машинное обучение , глубокое обучение и..

    Какую последнюю статью вы считаете стоящей поделиться?
    Я люблю читать качественные статьи. Не стесняйтесь делиться своей работой.

    Преобразование CoreML, позволяющее использовать Fast-Neural-Style-Transfer на iOS и MacOS.
    Как использовать Fast-Neural-Style-Transfer на iOS Преобразованная модель: GitHub — john-rocky/CoreML-Models: Преобразованный зоопарк моделей CoreML...

    ИИ в правоохранительных органах: мощный инструмент с двойной природой
    Искусственный интеллект (ИИ) революционизирует правоохранительную деятельность, предлагая инновационные тактики расследования, повышая достоверность доказательств и оптимизируя процессы. Тем..

    Autoencoder Average Distance  — классический способ, используемый внутри Microsoft для выявления сходства…
    Среднее расстояние автоэнкодера (AAD) использует более простой подход для определения расстояния между двумя наборами данных. Нейронный автоэнкодер может преобразовать любой элемент данных в..