Rails加入has_many关系但也想要没有关系的结果

时间:2017-11-08 23:32:24

标签: ruby-on-rails activerecord

我不确定实现以下目标的最佳方法:

我们拥有属于某个国家/地区的用户。然后,我们有几个类别可以针对每个国家/地区进行不同的定位。

我想获得一个包含所有类别及其在给定国家/地区的位置的数组(按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)排序,然后按名称(如果位置相等)和列表类别末尾没有位置排序。

1 个答案:

答案 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")