Странное поведение CAST с 0 в рельсах - PullRequest
0 голосов
/ 02 декабря 2018

Извините за длинный запрос, но это то, с чем я работаю.Я получил этот запрос в rails

@posts = Cama::PostType.first.posts.joins(:custom_field_values).where("(status = ?) AND (cama_custom_fields_relationships.custom_field_slug = ? AND 
CAST(cama_custom_fields_relationships.value AS INTEGER) >= ? AND 
CAST(cama_custom_fields_relationships.value AS INTEGER) <= ? ) OR 
(cama_custom_fields_relationships.custom_field_slug = ? AND 
CAST(cama_custom_fields_relationships.value AS INTEGER) >= ? AND 
CAST(cama_custom_fields_relationships.value AS INTEGER) <= ? ) AND 
(LOWER(title) LIKE ? OR LOWER(content_filtered) LIKE ?)","published", "filtry-
powierzchnia", params['size-start'].to_i, params['size-end'].to_i,"filtry-
cena", params['price-start'].to_i, params['price-end'].to_i 
,"%#{params[:q]}%", 
"%#{params[:q]}%").group("cama_posts.id").having("COUNT(cama_custom_fields_rel
ationships.objectid) >= 2") 

, которые делают это sql

CamaleonCms::Post Load (0.9ms)  SELECT  "cama_posts".* FROM "cama_posts"
 INNER JOIN "cama_custom_fields_relationships" ON 
"cama_custom_fields_relationships"."objectid" = "cama_posts"."id" AND 
"cama_custom_fields_relationships"."object_class" = $1 WHERE 
"cama_posts"."post_class" = $2 AND "cama_posts"."taxonomy_id" = $3 AND 
((status = 'published') AND 
(cama_custom_fields_relationships.custom_field_slug = 'filtry-powierzchnia'
AND CAST(cama_custom_fields_relationships.value AS INTEGER) >= 1 AND 
CAST(cama_custom_fields_relationships.value AS INTEGER) <= 10000 ) OR 
(cama_custom_fields_relationships.custom_field_slug = 'filtry-cena' AND 
CAST(cama_custom_fields_relationships.value AS INTEGER) >= 0 AND 
CAST(cama_custom_fields_relationships.value AS INTEGER) <= 10000000 ) AND
(LOWER(title) LIKE '%%' OR LOWER(content_filtered) LIKE '%%')) GROUP BY 
cama_posts.id HAVING (COUNT(cama_custom_fields_relationships.objectid) >= 2)
 ORDER BY "cama_posts"."post_order" ASC, "cama_posts"."created_at" DESC LIMIT
 $4 OFFSET $5  [["object_class", "Post"], ["post_class", "Post"], 
["taxonomy_id", 2], ["LIMIT", 6], ["OFFSET", 0]]

Как вы можете видеть, я использую CAST, я не могу изменить столбец только на целое число, потому что это CMS.Я создал custom_field, которое должно быть целым числом, но таблица в БД все еще текстовая, поэтому я вынужден сделать это таким образом.

Теперь все в порядке, если мой

..CAST(cama_custom_fields_relationships.value AS INTEGER) >= 1..

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

CamaleonCms::Post Load (0.9ms)  SELECT  "cama_posts".* FROM "cama_posts"
     INNER JOIN "cama_custom_fields_relationships" ON 
    "cama_custom_fields_relationships"."objectid" = "cama_posts"."id" AND 
    "cama_custom_fields_relationships"."object_class" = $1 WHERE 
    "cama_posts"."post_class" = $2 AND "cama_posts"."taxonomy_id" = $3 AND 
    ((status = 'published') AND 
    (cama_custom_fields_relationships.custom_field_slug = 'filtry-powierzchnia'
    AND ****CAST(cama_custom_fields_relationships.value AS INTEGER) >= 0**** AND 
    CAST(cama_custom_fields_relationships.value AS INTEGER) <= 10000 ) OR 
    (cama_custom_fields_relationships.custom_field_slug = 'filtry-cena' AND 
    CAST(cama_custom_fields_relationships.value AS INTEGER) >= 0 AND 
    CAST(cama_custom_fields_relationships.value AS INTEGER) <= 10000000 ) AND
    (LOWER(title) LIKE '%%' OR LOWER(content_filtered) LIKE '%%')) GROUP BY 
    cama_posts.id HAVING (COUNT(cama_custom_fields_relationships.objectid) >= 2)
     ORDER BY "cama_posts"."post_order" ASC, "cama_posts"."created_at" DESC LIMIT
     $4 OFFSET $5  [["object_class", "Post"], ["post_class", "Post"], 
    ["taxonomy_id", 2], ["LIMIT", 6], ["OFFSET", 0]]

Я получаю ошибку:

ActionView::Template::Error (PG::InvalidTextRepresentation: ERROR:  invalid input syntax for integer: "/media/1/asd.jpg"
: SELECT  "cama_posts".* FROM "cama_posts" INNER JOIN "cama_custom_fields_relationships" ON "cama_custom_fields_relationships"."objectid" = "cama_posts"."id" AND "cama_custom_fields_relationships"."object_class" = $1 WHERE "cama_posts"."post_class" = $2 AND "cama_posts"."taxonomy_id" = $3 AND ((status = 'published') AND (cama_custom_fields_relationships.custom_field_slug = 'filtry-powierzchnia' AND CAST(cama_custom_fields_relationships.value AS INTEGER) >= 0 AND CAST(cama_custom_fields_relationships.value AS INTEGER) <= 10000 ) OR (cama_custom_fields_relationships.custom_field_slug = 'filtry-cena' AND CAST(cama_custom_fields_relationships.value AS INTEGER) >= 0 AND CAST(cama_custom_fields_relationships.value AS INTEGER) <= 10000000 ) AND (LOWER(title) LIKE '%%' OR LOWER(content_filtered) LIKE '%%')) GROUP BY cama_posts.id HAVING (COUNT(cama_custom_fields_relationships.objectid) >= 2) ORDER BY "cama_posts"."post_order" ASC, "cama_posts"."created_at" DESC LIMIT $4 OFFSET $5):

и @posts возвращает его в запросе lvl, поэтому его ошибка не возникает где-то еще.

Я пытался CASTing to numeric, та же проблема.Это происходит только когда его начальное условие, когда перед ним есть другое условие, оно принимает 0, как в моем примере, второе условие после этого работает с> = 0

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