Ruby on rails 3 在联合表中搜索

Ruby on rails 3 在联合表中搜索,ruby-on-rails-3,search,has-and-belongs-to-many,Ruby On Rails 3,Search,Has And Belongs To Many,我需要一些帮助来在我的视图中放置搜索字段 我有一张家庭表,每个家庭都有0-n本书。我想进行搜索,只显示特定书籍的系列 现在我正在使用ransack进行其他一些简单的搜索: 控制器: class FamiliesController < ApplicationController def index @search = Family.search(params[:q]) @families = @search.result respond_to do |

我需要一些帮助来在我的视图中放置搜索字段

我有一张家庭表,每个家庭都有0-n本书。我想进行搜索,只显示特定书籍的系列

现在我正在使用ransack进行其他一些简单的搜索:

控制器:

class FamiliesController < ApplicationController
  def index
    @search = Family.search(params[:q])
    @families = @search.result    

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @families }
    end
  end
class FamiliesController
型号:

class Family < ActiveRecord::Base
  has_many :names
  has_and_belongs_to_many :books, :join_table => "books_families"
  has_and_belongs_to_many :races, :join_table => "families_races"

  attr_accessible :descr, :nome, :book_ids, :race_ids

  validates :nome, uniqueness: true, presence: true
end
类族“书籍家庭”
拥有和属于多个:种族,:加入\u表=>“家庭\u种族”
可访问属性:descr、:nome、:book\u id、:race\u id
验证:nome,唯一性:true,存在性:true
终止
视图:


家庭过滤器

“搜索字段”%> 书 描述 (...)
  • (...)

    我该怎么办?

    我不熟悉ransack,但您的查询应该可以通过SQL实现。我不知道您所有的表/字段名,但类似的东西应该可以工作

    @families = Family.where("families.id IN(SELECT books_families.family_id FROM 
                              books_families WHERE books_families.book_id IN( 
                              SELECT books.id FROM books WHERE books.title LIKE(?)))",
                              "%" + params[:q] + "%")
    

    终于找到了解决办法。这是一个简单的两点:

      <div class="field">
        <%= f.label :books_id_eq, "Livro:" %><br />
        <%= f.collection_select :books_id_eq, Book.order(:nome), :id, :nome, :include_blank => "Todos" %> 
      </div>
    
    
    
    “待办事项”%>
    那么,您希望用户搜索一本书,并且您的代码返回与该书相关的所有族,对吗?是的,这就是我需要的,我的答案解决了您的问题吗?我直到现在才测试它。不,没用:>>@search!!#我只是注意到,我不知道如何在sqlI中执行相同的查询。我查看了我的代码,发现有几个语法错误。我已经改正了。此SQL假定您有一个名为
    families
    的表,其中包含
    id
    列。一个名为
    books
    的表,至少有一个
    id
    title
    列,以及一个链接两个名为
    books\u系列
    的表,其中有一个
    book\u id
    列和一个
    family\u id
    列。如果这些字段/表的名称不同,您可以在查询中自己更改它们,或者将它们发布在此处,我可以帮助您。
      <div class="field">
        <%= f.label :books_id_eq, "Livro:" %><br />
        <%= f.collection_select :books_id_eq, Book.order(:nome), :id, :nome, :include_blank => "Todos" %> 
      </div>