我有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