我不确定实现以下目标的最佳方法:
我们拥有属于某个国家/地区的用户。然后,我们有几个类别可以针对每个国家/地区进行不同的定位。
我想获得一个包含所有类别及其在给定国家/地区的位置的数组(按category_position.position排序,然后是category.name)。我还希望列表包含没有添加category_position的类别。
我有以下结构:
class Country < ApplicationRecord
has_many :category_position
class Category < ApplicationRecord
has_many :category_position
class CategoryPosition < ApplicationRecord
attr_accessible :country_id, :position, :category_id
belongs_to :country
belongs_to :category
我尝试使用
categories = Category.joins(:category_position)
.where("category_positions.country_id = #{user.country.id}")
这为我提供了为用户所在国家/地区添加了职位的所有类别。如何获得相同的列表,以及所有没有为用户所在国家/地区添加职位的类别?
理想情况下,此列表应按位置(1,2,3)排序,然后按名称(如果位置相等)和列表类别末尾没有位置排序。
答案 0 :(得分:2)
我没有对此进行过测试,但我认为您必须使用左外连接并且调整where子句
for Rails 5
categories = Category.left_outer_joins(:category_position)
.where("category_positions.country_id = #{user.country.id} or category_positions.country_id is NULL")
对于Rails 4及更早版本
categories = Category.joins("left outer join category_positions on category_positions.category_id = categories.id")
.where("category_positions.country_id = #{user.country.id} or category_positions.country_id is NULL")