Ruby Sequel左外连接查询

时间:2018-03-27 07:23:03

标签: ruby sequel

我有一个更复杂的查询(不起作用)

query.select_all(:table_1).select_more(:col_1)
.left_outer_join(:table_2, table_1_id: :id, col_1: 1, 
Seqel.lit('col_2 > ?', 1.week.ago)

我需要像这样比较col_2

"col_2 > '2018-01-01 10:10:10'"

将整个查询编写为自定义sql很容易,但我想链接方法,到目前为止我无法成功添加上述内容。

预期结果〜:

"SELECT `table_1`.*, `table_2`.`col_1` FROM `table_1`
LEFT OUTER JOIN `table_2` 
ON (
`table_2`.`table_1_id` = `table_1`.`id`
AND
`table_2`.`col_1` = 1 
AND 
`table_2`.`col_2` > '2018-01-01 10:10:10')"

我使用with_sql但忽略了其他范围。 我也试过了:

 .left_outer_join("`table_2` ON (`table_2`.`table_1_id` =
 `table_1`.`id` AND `table_2`.`col_1` = 1 AND `table_2`.`col_2` >
 '2017-09-28 06:49:53 UTC')")

最后一个问题是它用额外的``

包裹整个字符串

对我有用的是什么:

.left_outer_join(:table_2, 
Sequel.lit('table_2.table_1_id = table_1.id AND table_2.col_1 = ? 
AND table_2.col_2 > ?', id, date))

但有没有办法在不使用字符串查询的情况下完成它?

3 个答案:

答案 0 :(得分:1)

.left_outer_join(:table_2, :table_1_id=>:id, :col_1=>id){Sequel[:table_2][:col_2] > date}

答案 1 :(得分:0)

这可能有点清洁:

.left_outer_join(:table_2,
   table_2.where(table_1_id: 'table_1.id')
          .where(col_1: id)
          .where('col 2 > ?', date)
 )

答案 2 :(得分:0)

我会发布自己的答案,但不会接受,因为我认为可以做得更好。

.left_outer_join(:table_2, 
Sequel.lit('table_2.table_1_id = table_1.id AND table_2.col_1 = ? 
AND table_2.col_2 > ?', id, date))

等待其他建议。