Rails SQL query builder… Or ActiveRecord query builder

后端 未结 3 1717
终归单人心
终归单人心 2020-12-19 11:21

I need to run sql query like

sql = \'SELECT * FROM users WHERE id != \' + self.id.to_s + \' AND id NOT IN (SELECT artner_id FROM encounters WHERE user_id =          


        
3条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-19 11:47

    You need the squeel gem. It extends AR with blocks and makes very complicated queries with ease.

    Just few features:

    # not_in == cool! )
    Product.where{id.not_in LineItem.select{product_id}}
    # SELECT "products".* FROM "products" WHERE "products"."id" NOT IN 
    # (SELECT "line_items"."product_id" FROM "line_items" )
    
    # outer joins on pure Ruby:
    LineItem.joins{product.outer}
    # LineItem Load (0.0ms)  SELECT "line_items".* FROM "line_items" 
    # LEFT OUTER JOIN "products" ON "products"."id" = "line_items"."product_id"
    
    # calcs, aliasing:
    Product.select{[avg(price).as(middle)]}
    # SELECT avg("products"."price") AS middle FROM "products"
    
    # comparison
    Product.where{id != 100500}
    Product.where{price<10}
    
    # logical OR
    Product.where{(price<10) | (title.like '%rails%')}
    # SELECT "products".* FROM "products" WHERE (("products"."price" < 10 OR
    # "products"."title" LIKE '%rails%'))
    
    # xxx_any feature (also available xxx_all)
    Product.where{title.like_any %w[%ruby% %rails%]}
    # SELECT "products".* FROM "products" WHERE (("products"."title" LIKE '%ruby%' OR 
    # "products"."title" LIKE '%rails%'))    
    

    Note the using blocks: {...} here aren't hashes. Also note the absence of symbols.

    If you decide to pick it, read the section that starts with "This carries with it an important implication"

提交回复
热议问题