如何从 rails 中的 has_many 关联过滤要显示的元素

How to filter elements to be displayed from a has_many association in rails

假设我通过 has_many 关联有 3 个嵌套模型:

class Map
  has_many :countries
end

class Country
  has_many :cities
  belongs_to :map
end

class City
  belongs_to :country
  belongs_to :user
end

我有一个通过 MapsController 显示地图 -> 国家 -> 城市的视图,没问题。

现在城市有一个 :published 属性,我想将该视图过滤为 个已发布 + 未发布且用户 == current_user.[= 的城市14=]

我尝试将 has_many 关联与过滤后的对象相关联,但这种方法的问题是自动保存会删除不符合条件的对象。

我可以过滤视图中的城市,使用城市范围和视图中的伪代码:

@map.countries.each do |country|
  country.cities_published_and_unpublished_by_user(current_user).each do |country|
    display country
  end
end

但是味道不是很好。特别是在未来我可能想要添加更多的决定,我相信这些属于控制器。

我确定我遗漏了一个模式...有什么提示吗?

试试这个附加关系。

class Map
  has_many :countries
  has_many :cities, through: countries
end

class Country
  has_many :cities
  belongs_to :map
end

class City
  belongs_to :country
  belongs_to :user
end

您现在可以拨打:

@cities = @map.cities.where(user: current_user)

并且在视图中:

@cities.each(&:display)

现在显示 published/unpublished 个项目,您可以在城市模型上使用范围或默认范围。

在你的控制器 your_condition 取决于您有多少个可能的值:published

@cities = current_user.cities.where(your_condition)

例如

@cities = current_user.cities.where({published: ["published", "unpublished"]})

在您看来

<% @cities.each do |c| %>
  # your code to show each city
  c
<% end %>