Activerecord, выберите в строке сравнения - PullRequest
0 голосов
/ 29 июня 2009

У меня есть таблица с именем Basic, start_time - это одно поле с типом: VARCHAR (5), в котором на самом деле хранятся 5-байтовые данные времени: байты 0 и 1 отображаются в год, месяц и день, а байты 2 - 4 отображаются до часа, мин и секунды. Таким образом, возможно, все байты 2, 3, 4 равны 0. И я хочу сделать следующий запрос:

Basic.find (:all , :conditions => "start_time > ? AND end_time < ?" , start_time , end_time)

Вот вопросы:

Предположим, что в формате VARCHAR (5) время начала [214, 222,0, 0, 0] (24 июня 2009 г.) и время окончания [214, 223, 0, 0, 0] ( 25 июня 2009 г.).

Поскольку activerecord отображает VARCHAR (5) в String, в приведенном выше запросе start_time и end_time также должны быть String. Как правильно преобразовать указанное выше время формата VARCHAR (5) в строку?

Я сделал это таким образом, но не смог получить правильный результат:

tmp = [214, 222,0 ,0 ,0].map {|t| t.to_s(16)} ; start_time = tmp.to_s

И я использовал адаптер sqlite3 для активной записи.

Спасибо за вашу помощь.


Я нашел, где проблема: «\ 000» не может содержаться в start_time при выполнении следующего запроса:

Basic.find (:all , :conditions => "start_time > ? AND end_time < ?" , start_time , end_time)

Итак, мне нужно сделать два шага:

  1. [214, 222,0, 0, 0] -> [214,222]

  2. [214,222] -> "\ 326 \ 336"

1-й шаг можно выполнить с помощью:

a = [214,222,0,0,0] 
while a.last ==0 do a.pop end

2-й шаг можно выполнить с помощью:

a = [214,222]
a.pack("c" * a.size)

Однако я все еще не могу выполнить запрос при start_time = [214, 222,0, 23, 0], потому что соответствующая строка содержит «\ 000» в середине. к счастью, это не будет большой проблемой в нашем приложении, так как мы никогда не запрашиваем на уровне часов, это означает, что последние два числа всегда будут равны 0.

1 Ответ

0 голосов
/ 29 июня 2009

Это то, что вы ищете?

[214, 222, 0, 0, 0].inject(""){|s,c| s << c.chr; s} # => "\326\336\000\000\000"

Относительно того, почему я знаю это ... Я хотел сказать MLM в твиттере один раз, фактически не говоря этого. Потому что, если вы на самом деле говорите это, вас автоматически сопровождают все эти спаммеры MLM. Поэтому вместо этого я сказал

[77, 76, 77].inject(""){|s,c| s << c.chr; s}

В вашем случае, тем не менее, кажется, что нужно много работать, чтобы избежать использования метки времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...