ruby-on-rails - Rails SQL 查询生成器...或 ActiveRecord 查询生成器

标签 ruby-on-rails ruby ruby-on-rails-3 activerecord gem

我需要像这样运行sql查询

sql = 'SELECT * FROM users WHERE id != ' + self.id.to_s + ' AND id NOT IN (SELECT artner_id FROM encounters WHERE user_id = ' + self.id.to_s + ')'
sql += ' AND id NOT IN (SELECT user_id FROM encounters WHERE partner_id = ' + self.id.to_s + ' AND predisposition = ' + Encounter::Negative.to_s + ')'
sql += ' AND cfg_sex = ' + self.sex.to_s + ' AND cfg_country = ' + self.country.to_s + ' AND cfg_city = ' + self.city.to_s
sql += ' ORDER BY rand() LIMIT 1'

AR.find_by_sql可以执行,但是之前的代码可读性差。 是否有可以构建该查询的查询构建器?

例如,Kohana(它是 PHP 框架,我是 php 开发人员,但我想将那种 child 语言更改为 ruby​​/rails)有一个查询构建器,其工作方式如下:

$sql = DB::select('*')->from('users');
$sql->where('id', 'NOT_IN', DB::expr('SELECT partner_id FROM encounters WHERE user_id = '.$user->id));
$sql->where('id', 'NOT_IN', DB::expr('SELECT user_id FROM encounters WHERE partner_id = '.$user->id.' AND predisposition = '.Encounter::Negative));
....
etc
...

使用 Kohana 查询构建器等查询构建器构建的查询更具可读性和可理解性。

有什么gem可以解决这个问题吗?

最佳答案

您需要 squeel gem 。它使用 block 扩展 AR,并轻松进行非常复杂的查询。

只有几个特点:

# 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%'))    

请注意 using block :{...} 这里不是哈希。另请注意没有符号。

如果您决定选择它,请阅读以“这具有重要意义”开头的部分

关于ruby-on-rails - Rails SQL 查询生成器...或 ActiveRecord 查询生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10550453/

相关文章:

ruby-on-rails - ActiveRecord find_or_build_by

ruby-on-rails - 将 ActiveRecord 查询转换为 PostgreSQL 查询

ruby-on-rails - 了解如何通过 Postgres/rails 解释数据优化查询

java - 我应该尝试在 Java 项目中重用 Ruby 代码吗?

mysql - 如何在 Rails 中使用 ActiveRecord::Base 运行源命令

ruby - 在Ruby中获取组在正则表达式中的值

ruby-on-rails - encode_www_form 将空格转换为 + 而不是 %20

ruby-on-rails - 在 session 中临时存储回形针对象

javascript - 我可以在资源中的 CoffeeScript 中使用 `render` 函数吗?

ruby-on-rails - SimpleCaptcha 图像未加载(无法批量分配 protected 属性)