Ruby on rails 3 在联合表中搜索
我需要一些帮助来在我的视图中放置搜索字段 我有一张家庭表,每个家庭都有0-n本书。我想进行搜索,只显示特定书籍的系列 现在我正在使用ransack进行其他一些简单的搜索: 控制器: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 |
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>