Rails Sql Query для МЕСЯЦА И ГОДА - PullRequest
4 голосов
/ 13 апреля 2011

Я пытаюсь отобразить транзакции продаж за текущий месяц и год в моем представлении индекса.
Это то, что я поместил в свой контроллер продаж:

def index
 @sales = show_sales_for_current_month(@sales)

, который использует этот методв SalesHelper

def show_sales_for_current_month(sales)
  sales = Sale.find(:all,
                  :conditions => ["MONTH(date) = ? AND YEAR(date) =?",
                                  Date.today.month, Date.today.year])
end

, где date - тип данных даты.

, но я получаю следующую ошибку контроллера:

SQLite3::SQLException: no such function: MONTH: SELECT "sales".* FROM "sales" WHERE (MONTH(date) = 4 AND YEAR(date) =2011)

Я посмотрел вокругв сообщениях, и кажется, что это правильная функция, так что я делаю не так?Спасибо!

Ответы [ 3 ]

4 голосов
/ 13 апреля 2011

Привет, у меня есть драгоценный камень под названием by_star , который может помочь вам с такими запросами.В вашем случае вам нужно будет сделать это только на контроллере:

@sales = Sale.by_month

by_star позаботится о том, чтобы определить, какой это месяц и год, а также о грязном SQL.

3 голосов
/ 13 апреля 2011

Функции MONTH и YEAR не существуют в SQLite3.Вы можете использовать такой подход (взят из моего текущего проекта):

модель entry.rb:

  def self.all_entries_year(year, user_id)
    where('entries.user_id = :id', :id => user_id ).
    where(':first_day <= entries.date AND entries.date <= :last_day', { 
        :first_day => Date.new(year, 1, 1),
        :last_day => Date.new(year, 12, 31)
    }).
    order('date desc')
  end

РЕДАКТИРОВАТЬ:

Поместите это в вашу модель: продажи.rb (я полагаю, у него есть дата поля)

def self.show_sales_for_current_month(year, month)

  mydate = Date.new(year, month, 1)

  where(':first_day <= sales.date AND sales.date <= :last_day', { 
        :first_day => mydate,
        :last_day => mydate.at_end_of_month
  }).
  order('date')
end
0 голосов
/ 13 апреля 2011

В MySQL это работает, но вы используете SQLite3, поэтому вам нужно изменить запрос, чтобы использовать SQLite3-версию MONTH и YEAR, что означает использование функции strftime:

sales = Sale.find(:all,
  :conditions => ["strftime('%m', date) = '?' AND strftime('%Y', date) = '?'",
    '%02d' % Date.today.month, Date.today.year])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...