Rails的Ransack使用check_box搜索关联的模型

时间:2012-05-24 10:23:46

标签: ruby-on-rails ruby ruby-on-rails-3 forms ransack

当我使用'ransack',一个Rails Serching gem时,我迷路了。

我想要做的是为相关模型设置复选框。

这是我的代码。

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”并单击“立即查找”按钮,日志显示如下;

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”=&gt;“场地”。

请为此提出解决方案。

先谢谢。

1 个答案:

答案 0 :(得分:4)

实际上问题是因为您的第二个密钥是:shows_tickets_store_con,但应该是shows_tickets_store_cont。如果属性具有谓词{{​​1}},则它接受该属性。

Ransack文档:

https://github.com/ernie/ransack

_cont

#Edited 1

我做了一些调查。

我不认为你的方法对你的情况有好处。如果选择了所有cont (contains) and start (starts with) are just two of the available search predicates. See Constants for a full list. ,则您的元搜索会出现问题 - 您必须设置另一个checkboxes。在您的情况下,它可能是谓词 - 因为您使用predicate(复选框)。

让SQL像:

multiple values

可能的谓词:

另请阅读: