2012-05-24 46 views
3

当我使用'ransack',一个Rails Serving宝石时,我迷路了。Rails的Ransack搜索与check_box相关的模型

我想要做的是工作复选框为一个asociated模型。

这是我的代码。

shows_controller.rb

class ShowsController < ApplicationController 
def index 
    @q = Show.search(params[:q]) 
    @shows = @q.result(:distinct => true) 
    @shows = @shows.joins(:tickets) 

    respond_to do |format| 
     format.html # index.html.erb                          
     format.json { render json: @shows } 
    end 
end 

index.html.erb

<%= search_form_for @q do |f| %> 
    <%= f.label "Show's Title: " %> 
    <%= f.search_field :title_cont %> 
    <%= f.label "Buy at:" %> 
    <%= check_box_tag 'q[shows_tickets_store_cont[]]', 'venue' %>At Venue 
    <%= check_box_tag 'q[shows_tickets_store_cont[]]', 'ticketmaster' %>Ticketmaster 
    <%= submit_tag "Find Now" %> 
<% end %> 

<% @shows.each do |show| %> 
    <%= show.title %> | 
    <% show.tickets.each do |ticket| %> 
    <%= ticket.store %><br /> 
    <% end %> 
<% end %> 

show.rb

class Show < ActiveRecord::Base 
    has_many :tickets 
end 

ticket.rb

class Ticket < ActiveRecord::Base 
    belongs_to :show 
end 

当我在search_field中写了一些东西时,选中了“check_box”并点击“Find Now”按钮,日志显示如下;

Parameters: {"utf8"=>"✓", "q"=>{"title_cont"=>"something", "shows_tickets_store_cont"=>"venue"}, "commit"=>"Find Now"} 
Show Load (1.1ms) SELECT DISTINCT `shows`.* FROM `shows` INNER JOIN `tickets` ON `tickets`.`show_id` = `shows`.`id` WHERE (`shows`.`title` LIKE '%something%') LIMIT 25 OFFSET 0 

我不知道为什么SQL不具有Ticket.store WHERE条款,尽管收到“shows_tickets_title_cont” =>“场地”票控制器。

请为此建议解决方案。

在此先感谢。

回答

4

其实问题是因为你的第二个关键是:shows_tickets_store_con但应该是shows_tickets_store_cont。它接受属性,如果它有谓词_cont

洗劫文档:

https://github.com/ernie/ransack

cont (contains) and start (starts with) are just two of the available search predicates. See Constants for a full list. 

#编辑了1

我做过调查了一下。

我不认为你的方法适合你的情况。如果所有的checkboxes被选中,那么你的元搜索会遇到问题 - 你必须设置另一个predicate。在你的情况下,它可能是谓词 - 因为你使用multiple values(复选框)。

让SQL这样的:

"shows_tickets_store" IN ('venue','something') 

可能的谓词:

也这样说的:

+0

我纠正我的错字。 –

+0

我认识到我应该使用思维狮身人面像或太阳黑子或elasticSearch。 –

+0

我已经更新了我的答案。 – thesis