3

Rails Serching の gem である「ransack」を使用すると、道に迷いました。

私がやりたいことは、関連付けられたモデルのチェックボックスを機能させることです。

これが私のコードです。

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

WHEREチケットコントローラーが「shows_tickets_title_cont」=>「venue」を受け取ったにもかかわらず、SQLにTicket.storeの句がない理由がわかりません。

これに対する解決策を提案してください。

前もって感謝します。

4

1 に答える 1

4

実際の問題は、2番目のキーが次のとおりshows_tickets_store_conであるためshows_tickets_store_contです。述語がある場合は属性を受け入れます_cont

Ransackのドキュメント:

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')

可能な述語:

これも読んでください:

于 2012-05-24T10:51:25.667 に答える