我有3个模型,类别,产品和项目。Rails关系问题(类别,产品和项目)
目标是获得所有具有产品(category.products.count> 0)的类别的列表,以及产品所属的项目未标记为专用的列表。
class Category < ActiveRecord::Base
has_many :products
end
class Product < ActiveRecord::Base
belongs_to :project
belongs_to :user
belongs_to :category
end
class Project < ActiveRecord::Base
belongs_to :user
has_many :products
end
class ApplicationController < ActionController::Base
protected
def set_categories
@categories = Category.joins(:products).where("products.is_product = true or
products.is_loving_this = true")
category = Category.find_by(title: "All")
@categories.unshift(category).uniq!
end
end
views/layouts/_title_bar.html.haml
%nav.navbar-custom1.navbar.navbar-custom1.navbar-default.navbar-static-top{role: "navigation"}
.container
.col-xs-4
%ul.nav.navbar-nav
%ul.dropdown#dropdown_title_bar
%a.dropdown-toggle{"data-toggle" => "dropdown", href: "#", type: "button"}
Products
%b.caret
%ul.dropdown-menu{"aria-labelledby" => "dropdown-menu", role: "menu"}
- @categories.each do |c|
- if c.products.count > 0 || c.title == "All"
%li= link_to c.title, category_path(c)
上面的代码给了我所有类别的下拉列表,其中category.products.count> 0,但我无法弄清楚如何只得到产品,该product.project.private ==假。
任何人都可以指导我如何添加? 我想过要做2个循环,但似乎很混乱。
- @categories.each do |c|
- if c.products.count > 0 || c.title == "All"
- c.products.each do |product|
- if product.project && product.project.private == false
%li= link_to c.title, category_path(c)
最后美中不足的是,有时产品所不具备的一个项目,这就是为什么我添加的第一个if语句 - 如果product.project & & product.project.private ==假
先谢谢你们。
小事,但你也可以用'pluck(:category_id)'替换'map(&:category_id)',这应该减少从数据库传输的数据量。你可以尝试的另一件事是(不知道是否会工作):'@categories = Category.scoped.merge(Product.is_public.product_type).merge(Product.loving_this_type)' – 2014-09-03 00:15:02