группа rails3 по проблеме с sqlite3

#ruby-on-rails

#ruby-on-rails

Вопрос:

Следующий запрос должен сработать, но он не работает.

 class Keyword
  def self.popular_queries
    t = Time.now
    relation = Keyword.where(:created_at => (t.beginning_of_day..t.end_of_day))
    relation = relation.group(:name)
    relation = relation.select("name, COUNT(id) AS count_value")
    relation.to_a
  end
 end
  

результат следующий без значения count

 [#<Keyword name: "a">, #<Keyword name: "b">, 
#<Keyword name: "c">, #<Keyword name: "d">]
  

таблица ключевых слов содержит только два столбца name и идентификатор.

Решение заключается

   def self.popular
    t = Time.now
    relation = Keyword.where(:created_at => (t.beginning_of_day..t.end_of_day))
    relation = relation.group(:name)
    relation = relation.select("name, created_at, count(*) as c1")
    sql = relation.to_sql
    self.connection.select_all(sql)
  end
  

Ответ №1:

Проблема в том, что ваша Keyword модель не знает, что count_value такое, и вы создаете несколько Keyword экземпляров на основе SQL-запроса. Когда ваши экземпляры создаются, они видят count_value передаваемые им данные, но игнорируют их, поскольку у них нет count_value свойства.

Если вы хотите запустить произвольный SQL и получить обратно простые данные, вам следует использовать select_rows или аналогичные низкоуровневые методы.

Комментарии:

1. извините. Я должен был сказать, что в нем два столбца. имя и идентификатор.

2. обратите внимание, что sql не запускается. Он не показывает допустимый результат.

3. @Nadal: Что такое SQL, который создается за кулисами?

4. переключился на mysql и та же проблема. Ключевое слово.Загрузка популярного ключевого слова (1,8 мс) ВЫБЕРИТЕ name, created_at, считайте(*) как c1 ИЗ keywords WHERE ( keywords . created_at МЕЖДУ ‘2011-04-14 04:00:00’ И ‘2011-04-15 03:59:59’) СГРУППИРОВАТЬ ПО имени => [#<Имя ключевого слова: «a», created_at: «2011-04-14 17:55:15»>, #< Имя ключевого слова: «b», created_at: «2011-04-14 17:55:15»>, #< Имя ключевого слова: «c», created_at: «2011-04-14 17:55:15»>, #< Имя ключевого слова: «d», created_at: «2011-04-14 17:55:15»>]

5. Спасибо. это сделало это. Я обновил вопрос с ответом. Я посмотрю, примет ли rails core исправление для сбоя, если столбец не соответствует.