Reputation: 3
In model Banner
belongs_to :segment
belongs_to :basic_component
has_many :state_banners, dependent: :destroy
has_many :states, through: :state_banners
scope :banner_have_zero_cities, lambda { includes(state_banners: :state_banner_cities).where(state_banner_cities: {state_banner_id: nil}) }
scope :banner_by_state, lambda { |state_id| where("state_banners.state_id = ?", state_id) }
scope :banner_by_city, lambda { |city_id| joins(state_banners: :state_banner_cities).where("state_banner_cities.city_id = ?", city_id) }
In controller
def scoped_collection
@banners_cities = Banner.banner_by_city(city_id)
@banners_states =Banner.banner_by_state(city.state_id).banner_have_zero_cities
@banners = @banners_cities.concat(@banners_states)
return @banners.joins(:basic_component)
end
@banners_states.size => 1
@banners_cities.size => 2
@banners_states.merge(@banners_cities)
SQL (0.2ms) SELECT DISTINCT banners
.id
FROM banners
INNER JOIN state_banners
ON state_banners
.banner_id
= banners
.id
INNER JOIN state_banner_cities
ON state_banner_cities
.state_banner_id
= state_banners
.id
WHERE (state_banners.state_id = 3) AND state_banner_cities
.state_banner_id
IS NULL AND (state_banner_cities.city_id = '260') LIMIT 25 OFFSET 0
=> []
I need 3
i try concat
@banners = @banners_cities.concat(@banners_states) @banners.size => 3
but
@banners.joins(:basic_component).order("basic_component.order asc").size => 2
CACHE (0.0ms) SELECT COUNT(count_column) FROM (SELECT 1 AS count_column FROM banners
INNER JOIN state_banners
ON state_banners
.banner_id
= banners
.id
INNER JOIN state_banner_cities
ON state_banner_cities
.state_banner_id
= state_banners
.id
INNER JOIN basic_components
ON basic_components
.id
= banners
.basic_component_id
WHERE (state_banner_cities.city_id = '260') LIMIT 25 OFFSET 0) subquery_for_count
:(, help
Upvotes: 0
Views: 156
Reputation: 380
Your post is kind of hard to follow, but try .limit(3)
at the end of the query?
Upvotes: 0