left_outer_joins(:sales)
: This ensures that all
Item
records are included, even those without associated
sales
. Use this if you want items even if they don't have any sales that match the criteria. If you only want items that HAVE sales records, use
joins(:sales)
where.not(sales: { item_id: nil })
: This accurately filters for
Item
records that have associated
sales
with a non-null
item_id
.
Ruby:
@items = Item.left_outer_joins(:sales)
.where(unit_price: nil) # changed from 'is not null' based on comment
.where(item_type_id: @item_type_id)
.where("title LIKE ?", "%#{params[:search]}%") # Sanitize search input!
.where.not(sales: { item_id: nil })
.order(:title)
includes
vs. joins
: If you're not actually using data from the
sales
table in your view, you might not need
includes
(eager loading) and a simple
joins
(to perform the filtering) might be sufficient and faster.
preload
is also an option in Rails for eager loading. Choosing between
includes
,
preload
, and
joins
depends on the context of how you are using the data and the complexity of your associations.