基于has_many through在索引页面上过滤结果

时间:2014-12-21 13:30:11

标签: ruby-on-rails ruby activerecord

我已经尝试过像this这样的解决方案,但我是Rails的初学者,只是在完成Pragmatic Studio Rails I & II Course之后构建我的第一个应用

基本上,我想建立一个像BookYogaRetreats.com这样的简单列表网站 我试图找出如何实现过滤器逻辑。到目前为止,我有一个列表模型,类别和&分类。

清单模型:

has_many :categorizations, dependent: :destroy
has_many :categories, through: :categorizations

has_attached_file :image, styles: { :medium => "200x200#" }
validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/

validates :title, presence: true, uniqueness: true

paginates_per 15

scope :by_category, lambda { |category| includes(:categories).where(:categories => { :name => category }) }

分类模型:

belongs_to :listing
belongs_to :category

分类模型:

has_many :categorizations, dependent: :destroy
has_many :listings, through: :categorizations

我的列表控制器索引操作看起来像这样(我已经进行了很多实验......)

class ListingsController < ApplicationController
  before_action :find_listing, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, except: [:index, :show]
  before_filter :load_data, only: [:index]

def index
  @listings = @listings.includes(:categories).where(categories: { id: @category}) if @category_ids
  @listings = @listings.page(params[:page])

  respond_to do |format|
    format.js
    format.html
  end  
end

在我的jumbotron partial中,包括过滤器下拉列表,我有以下内容:

<div class="col-sm-6 col-md-4">
  <%= select_tag("listing[category_id]", options_from_collection_for_select(@categories, "id", "name") , { :prompt => 'Select a Category' }) %>
<%= submit_tag nil, class: "form_submit", method: "get" %>
</div> 

我的listing / index.html.erb看起来像这样:

<% @listings.each_slice(3) do |listings|%>
  <div id="listings">
  <div class="row">
    <% listings.each do |listing|%>
      <div class="col-md-4">
        <div class="listing">
          <div class="image_wrapper">
            <%= link_to listing do %>
              <%= image_tag listing.image.url(:medium) %>
            <% end %> 
            <h2><%= link_to listing.title, listing %></h2>
            <p><%= listing.start_date %> - <%= listing.end_date %></p> 
          </div>   
        </div>    
      </div>
    <% end %>
  </div>
</div>  
     

过去两天我试图找出一些东西,一直在试验Filterific Gem和Ransack。我真的不想使用宝石,目前我不明白我需要做什么。我可以使用类别过滤器,点击提交按钮后会重新加载显示属于该特定类别的所有列表的页面?拥有has_many通过关系可能不会让它变得更容易。

我希望能够拥有类似商品的内容吗?by_category = seminars,然后重新加载商品详情视图index.html.erb,并仅显示包含类别研讨会的商品详情。

我可能在这里完全走错了路。任何指针都将非常感谢。非常感谢。

1 个答案:

答案 0 :(得分:1)

管理在这里找到解决方案:

我的观点:

<%= form_tag listings_path, :controller => 'listings', :action => 'index', :method => 'get', :id => "category_select" do %>
  <%= collection_select( nil, :category_id, Category.all, :id, :name, { :include_blank => 'All Categories'} , { :class => 'form-control' })  %>
  <%= submit_tag nil, class: "form_submit" %>
<% end %>

我的控制器索引操作:

@listings = Listing.includes(:categorizations).page(params[:page])

if params[:category_id].blank?
  @listings
else
  @category_id = Category.find_by(id: params[:category_id])
  @listings = @category_id.listings
end

respond_to do |format|
  format.js
  format.html
end  

这将允许我使用/ listings?category_id = 5并解决问题。如果您有更优雅的提示,请告诉我。