Khi muốn muốn hợp nhất 2 câu query trong SQL thì chúng ta sẽ sử dụng UNION
và UNION ALL
, nhưng rails không support built in phương thức này
Thông thường chúng ta sẽ sử dụng những cách sau:
- Viết Raw SQL
- Dùng gem
active_record_union
- Sử dụng Arel đã có sẵn trong core của rails
Ví dụ bài toán là lấy ra 20 bài viết theo category A và 10 bài viết category B. sau đó sắp xếp lại theo ngày public bài viết.
category_a = Article.published
.joins(:category)
.where('categories.title = ?', 'A')
.limit(20).arel
category_b = Article.published
.joins(:category)
.where('categories.title = ?', 'B')
.limit(10).arel
union_all = Arel::Nodes::As.new(
Arel::Nodes::UnionAll.new(category_a, category_b),
Article.arel_table
)
// Result
articles = Article.from(union_all).order(published_at: :desc)