GithubHelp home page GithubHelp logo

Support for ANY in condition DSL about rom-sql HOT 5 OPEN

wuarmin avatar wuarmin commented on August 20, 2024
Support for ANY in condition DSL

from rom-sql.

Comments (5)

flash-gordon avatar flash-gordon commented on August 20, 2024

I wouldn't say it's a bug because filter_type_ids is a fallback identifier from Sequel rather than a ROM attribute. You should use where { self[:filter_type_ids].is(...) | ... }

from rom-sql.

wuarmin avatar wuarmin commented on August 20, 2024

hello @flash-gordon ,
thanks, that explains the problem, but if I change the code to:

filter_type_id = "test"
states
  .where { self[:filter_type_ids].any(filter_type_id) | self[:filter_type_ids].is(nil) }
  .order(:order)

I get following error:

     Failure/Error:
       states
         .where { self[:filter_type_ids].any(filter_type_id) | self[:filter_type_ids].is(nil) }
         .order(:order).to_a
     
     NameError:
       wrong constant name []
     
               types.const_get(type_name) if types.const_defined?(type_name)

from rom-sql.

flash-gordon avatar flash-gordon commented on August 20, 2024

@wuarmin sorry for the confusion, I think the truth is in the middle: there's in, there's no any in rom-sql API, that's why it falls back to Sequel. You should use

.where { filter_type_ids.is(nil) | filter_type_ids.in(*filter_type_id) }

There's no difference between col in (1, 2, 3) and col = any(array[1, 2, 3]) as far as I know.

from rom-sql.

wuarmin avatar wuarmin commented on August 20, 2024

Yes, there's no difference, but I cannot write it that way:

.where { filter_type_ids.is(nil) | filter_type_ids.in(*filter_type_id) }

produces

OR ("states"."filter_type_ids" IN ARRAY['test']::text[])

which is invalid and not what I need, I need

('test' = ANY("states"."filter_type_ids"))

What about adding any to rom-sql API?

from rom-sql.

flash-gordon avatar flash-gordon commented on August 20, 2024

which is invalid and not what I need, I need

I'm just saying it should have no difference at the database level. You can use inline SQL with backticks:

where { `filter_type_ids is null or filter_type_ids = any(array([#{filter_type_id.map { "'#{_1}'" }.join(',') }]))`  }

A PR with adding ANY is welcome.

from rom-sql.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.