Add relation#merge to merge two relations
This commit is contained in:
parent
08312e9958
commit
a8b10a2a8d
@ -12,6 +12,18 @@ def initialize(klass, relation, readonly = false, preload = [], eager_load = [])
|
|||||||
@loaded = false
|
@loaded = false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def merge(r)
|
||||||
|
joins(r.relation.joins(r.relation)).
|
||||||
|
group(r.send(:group_clauses).join(', ')).
|
||||||
|
order(r.send(:order_clauses).join(', ')).
|
||||||
|
where(r.send(:where_clause)).
|
||||||
|
limit(r.taken).
|
||||||
|
offset(r.skipped).
|
||||||
|
select(r.send(:select_clauses).join(', '))
|
||||||
|
end
|
||||||
|
|
||||||
|
alias :& :merge
|
||||||
|
|
||||||
def preload(*associations)
|
def preload(*associations)
|
||||||
create_new_relation(@relation, @readonly, @associations_to_preload + Array.wrap(associations))
|
create_new_relation(@relation, @readonly, @associations_to_preload + Array.wrap(associations))
|
||||||
end
|
end
|
||||||
@ -25,7 +37,7 @@ def readonly
|
|||||||
end
|
end
|
||||||
|
|
||||||
def select(selects)
|
def select(selects)
|
||||||
create_new_relation(@relation.project(selects))
|
selects.present? ? create_new_relation(@relation.project(selects)) : create_new_relation
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO : This is temporary. We need .from in Arel.
|
# TODO : This is temporary. We need .from in Arel.
|
||||||
@ -37,11 +49,11 @@ def from(from)
|
|||||||
end
|
end
|
||||||
|
|
||||||
def group(groups)
|
def group(groups)
|
||||||
create_new_relation(@relation.group(groups))
|
groups.present? ? create_new_relation(@relation.group(groups)) : create_new_relation
|
||||||
end
|
end
|
||||||
|
|
||||||
def order(orders)
|
def order(orders)
|
||||||
create_new_relation(@relation.order(orders))
|
orders.present? ? create_new_relation(@relation.order(orders)) : create_new_relation
|
||||||
end
|
end
|
||||||
|
|
||||||
def reverse_order
|
def reverse_order
|
||||||
@ -57,11 +69,11 @@ def reverse_order
|
|||||||
end
|
end
|
||||||
|
|
||||||
def limit(limits)
|
def limit(limits)
|
||||||
create_new_relation(@relation.take(limits))
|
limits.present? ? create_new_relation(@relation.take(limits)) : create_new_relation
|
||||||
end
|
end
|
||||||
|
|
||||||
def offset(offsets)
|
def offset(offsets)
|
||||||
create_new_relation(@relation.skip(offsets))
|
offsets.present? ? create_new_relation(@relation.skip(offsets)) : create_new_relation
|
||||||
end
|
end
|
||||||
|
|
||||||
def on(join)
|
def on(join)
|
||||||
|
@ -328,4 +328,12 @@ def test_destroy_all
|
|||||||
assert davids.loaded?
|
assert davids.loaded?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_relation_merging
|
||||||
|
devs = Developer.where("salary >= 80000") & Developer.limit(2) & Developer.order('id ASC').where("id < 3")
|
||||||
|
assert_equal [developers(:david), developers(:jamis)], devs.to_a
|
||||||
|
|
||||||
|
dev_with_count = Developer.limit(1) & Developer.order('id DESC') & Developer.select('developers.*, count(id) id_count').group('id')
|
||||||
|
assert_equal [developers(:poor_jamis)], dev_with_count.to_a
|
||||||
|
assert_equal 1, dev_with_count.first.id_count.to_i
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user