如何从 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 %>
假设我通过 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 %>