我想为我的网络应用程序创建一个导航系统,其中有几个主要的文章类别和每个类别的几个子标记。
例如,在“写作”类别中,可能会有“Essays”,“Poetry”和“Fiction”等子类别。
每篇文章都有一个标签列表。如果有人点击小说类别节目页面上的标签“意大利”,我就不希望其他类别如文章或诗歌的“意大利”标签出现在该页面上。
单击标记时,显示页面将是一个类别显示页面,其中包含该类别中具有该特定标记的所有文章的标记过滤器。它不会是标签显示页面。
另外,我想要一个带有相关标签的侧边栏。这些标签与降序显示在类别显示页面上的文章相同。我得到了相关的标签来处理Tag页面本身,但没有使用类别约束。
到目前为止,我可以将类别页面和标记页面分开工作,但我想整合两者。
我目前正在使用Acts作为Taggable类固醇标签和行为树作为类别。
有什么想法吗?
答案 0 :(得分:1)
我认为你在这里混合了两个概念,至少在问题中,可能不在你的应用程序中。您有一个使用acts_as_tree建模的类别列表。这支持子类别。标签不应属于子类别。您希望按标签和类别过滤或多或少。您应该能够编写返回文章列表的简单查询,例如:
@articles = Article.find(:all,
:include => "categories"
:conditions => ["(category_id = ? OR categories.parent_id = ?) AND tag_id = ?",
category_id, category_id, tag_id])
我用过的另一种复杂方法是使用Solr进行分面导航。它支持将这些过滤器与全文搜索相结合。
答案 1 :(得分:0)
但是,我的目标是在导航中包含子类别。我们的想法是,父类别将包含子类别中的所有内容,如果您单击子类别,它将缩小范围。我想我会查看Solr的想法,看看它是否使我的代码更简单。
经过一些试验和错误,我得到了我的代码。虽然看起来很乱。有关简化的任何建议吗?
BTW其中一些方法是通过AATOS定义的
在类别视图中#show:
<% for article in @articles %>
<%= link_to article.name, article %>
<% unless article.tag_list.empty? %>
<p class="tags">
Tags:
<%= render :partial => article.tags %>
</p>
<% end %>
对于标签/导航边栏,我有:
<% tag_cloud @tags, %w(css1 css2 css3 css4) do |tag, css_class| %>
<%= link_to tag, category_path(:filter => tag.name), :class => css_class %>
<% end %>
类别模型,(不理想,但有效)
class Category < ActiveRecord::Base
acts_as_tree
has_many :articles
has_many :child_articles, :through => :children, :source => :articles
def grand_articles
children.map {|c| c.child_articles}.flatten.uniq
end
def to_param
name
end
def family
child_articles + articles + grand_articles
end
端
最后丑陋的控制器代码:
class CategoriesController < ApplicationController
def show
@category = Category.find_by_name(params[:id])
if (params[:filter]).nil?
@articles = @category.family
else
@articles = Article.find_tagged_with(params[:filter],
:conditions => ["articles.id IN (?)", @category.family])
end
@tags =
if (params[:filter]).nil?
Article.tag_counts :conditions => ["articles.id IN (?)", @category.family]
else
Article.find_related_tags(params[:filter],
:conditions => ["tags.id IN (?)", @category.family.map {|a| a.tags}.flatten.uniq])
end
它可以工作,但它又是丑陋而脆弱的代码。我敢肯定我在这里犯了一些可怕的罪。任何有关清理的建议都表示赞赏。