2017-02-21 2 views
0

Эта ошибка появилась, когда я пытался искать из диапазона дат.Использование find_by_sql в диапазоне дает ошибку: undefined method `value_for_database 'для« 2017-01-01 »: String

Это моя модель:

def self.search(search) 
    if search 
    @policies = Policy.find_by_sql("acct_ent_date IN ?", start_date..end_date) 
    else 
    limit(10) 
    end 
end 
+0

Какой запрос вы получаете при компиляции? –

ответ

2

Вы редко должны упасть до написания необработанного SQL в рельсах (например, с помощью метода find_by_sql) - особенно для такого простого запроса, как это.

Вместо этого, вы можете просто написать следующее и ActiveRecord правильно преобразовать его в допустимый синтаксис SQL для вас:

# If you are looking for a list of all matching entries: 
Policy.where(acct_ent_date: start_date..end_date) 


# If you only wish to fetch the FIRST matching entry: 
Policy.find_by(acct_ent_date: start_date..end_date) 

Это будет генерировать SQL вроде следующего:

SELECT `policies`.* FROM `policies` WHERE (`policies`.`acct_ent_date` BETWEEN xxxxx AND yyyyy) 

Ключевая проблема с исходным (необработанным SQL) кодом заключается в том, что вы используете синтаксис WHERE IN - это действительно просто shorthand для нескольких условий ИЛИ. Это не имеет смысла использовать для объекта Range (start_date..end_date), поскольку он не является дискретным списком (то есть Array).

Если вы должны были попытаться преобразовать объект в массив, вы увидите что-то ошибки, как это:

(start_date..end_date).to_a # => TypeError: can't iterate from Time 
1

Просто, чтобы помочь кто-то сюда: Если вы хотите использовать параметры запроса с find_by_sql, вам нужно поставить все аргументы в массив, например:

Policy.find_by_sql(["acct_ent_date IN ?", start_date..end_date]) 

Я никогда не видел, проходя диапазон в качестве параметра запроса, поэтому я не могу прокомментировать, но в вообще "undef ined method `value_for_database '" возникает из-за того, что они не завершают аргументы в массиве.

Смежные вопросы