Во-первых, nil не == false, однако, nil оценивается как false. Попробуйте сами, если не верите:
irb(main):001:0> nil == false
=> false
irb(main):002:0> nil == nil
=> true
Какой из вариантов означает:
irb(main):003:0> false.nil?
=> false
Вы можете очистить свой код следующим образом, так как кажется, что @firsttime никогда не устанавливается к истине где угодно.
unless session[:visited]
session[:visited] = true
initglobals
end
Наконец, rake tmp: session: clear будет работать только в том случае, если вы используете ActiveRecordStore, если вы используете CookieStore (который используется по умолчанию). Тогда вам нужно будет очистить ваши куки или использовать reset_session.
Это известный эффект директивы top
в Access, но он не очень хорошо известен ...
Директива top
не работает. t вернуть верхние n
элементов, как легко убедить. Вместо этого он возвращает не менее n
отдельных элементов, определяемых порядком результатов.
В большинстве случаев это то же самое, но в вашем примере, где элементы с 5-го по 8-й имеют одинаковое значение порядка, все из они включены. Он возвращает первые пять элементов, а затем также все элементы, которые имеют то же значение порядка, что и пятый элемент.
Если вы не применяете какое-либо упорядочивание к таблице, учитываются все поля, поэтому, если у вас есть уникальное поле в результате запрос всегда будет возвращать пять элементов. То же самое, конечно, если уникальное поле включено в заказ.
Другие диалекты SQL могут вести себя иначе. Директива top
, например, в T-SQL (SQL Server) никогда не возвращает более n
элементов. Однако, указав пункты со связями
и в порядке
вместе с вверху
, можно наблюдать то же поведение, что и в Access.
Перейдите на страницу с именами справки Access 2003 О режиме запросов ANSI SQL (MDB) , затем разверните «Зачем использовать ANSI-92 SQL?» тема, и вы увидите следующее:
«Использование предложения LIMIT TO nn ROWS для ограничения количества строк, возвращаемых запросом»
Так что просто переведите пользовательский интерфейс Access в режим запроса ANSI-92 или используйте OLE DB ( например, ADO) в коде и добавьте в запрос предложение
LIMIT TO 5 ROWS
.
...
Шучу! Это просто еще один пример того, как ядро базы данных Access плохо документировано. Я думаю, что кто-то из группы документации Access сделал не слишком необоснованное предположение, что так называемый режим запроса ANSI-92 движка базы данных Access будет соответствовать стандарту ISO / ANSI SQL-92. Это не так.
Механизм базы данных Access имеет собственный собственный синтаксис TOP n (т. Е. Не-SQL-92 Standard) (не путать с собственным синтаксисом TOP n сервера SQL, который отличается семантически). Короче говоря, он не устраняет дубликаты. Если критериям удовлетворяет каждая строка в таблице, вы получите каждую строку в таблице в наборе результатов.
Обходной путь - использовать курсор для чтения только первых n строк в наборе результатов. Поскольку SQL базы данных Access не поддерживает процедурный код или явные курсоры, вам необходимо сделать это на стороне клиента, например