2017-10-10 41 views
-1

当试图在rails中搜索记录时,我希望能够返回与该id关联的所有记录。例如,如果我搜索“John”,我希望能够使用相同的fk返回所有记录。包含与在Ruby on Rails中使用搜索时找到的记录相关联的所有记录

表1

| id | 
------ 
| 1 | 
| 2 | 

表2

| id | fk | name | 
------------------- 
| 1 | 1 | John | 
| 2 | 1 | Doe | 
| 3 | 2 | David | 
| 4 | 2 | Smith | 

SQL

在控制器

Rails代码

includes(:table2).where('table2.name LIKE ?', "%#{search}%").references(:table2) 

SQL返回

SELECT FROM `table1` LEFT OUTER JOIN `table2` ON `table2`.`fk` = `table1`.`id` WHERE (table2.name LIKE '%John%') AND `table1`.`id` IN (1) 

这只返回找到搜索的行。我将如何使用相同的fk返回记录?

table1的使用has_many :table2和表2使用belongs_to :table1

提前感谢!

UPDATE

index.html.erb只包含提交输入到控制器和控制器运行查询并返回结果的形式。

预期输入:约翰

预期结果:

| id | fk | name | 
------------------ 
| 1 | 1 | John | 
| 2 | 1 | Doe | 

index.html.erb

<%= form_tag(categories_path, method: :get, :enforce_utf8 => false, id: "search-input") do %> 
    <%= text_field_tag :search, params[:search] %> 
    <button type="submit"></button> 
<% end %> 

categories_controller.rb

def index 
    @categories = Category.search(params[:search]) 
end 

def Category.search(search) 
    includes(:category_type).where('category_type.name LIKE ?', "%#{search}%").references(:category_type) 
end 
+1

如果你只是希望所有行的外键匹配,什么是“搜索”的逻辑?只需使用'table1.table2s'来获取给定'table1'的所有'table2'记录。 – meagar

+0

@meagar在前端我有一个搜索框,用户可以在其中搜索名称。据我所知,搜索逻辑用于返回与通过外键 –

+0

关联的匹配记录,他希望在'name'中搜索查询,然后返回所有具有该记录的记录名称,或共享相同的'fk'。因此,对于'约翰',结果将是'Table1.find(1).table2s' –

回答

0

我做返回所有的记录主表的查询,然后使用解决了这个他们的ID从第二张表中返回记录。我认为这可能是另一种一次性获得所有结果的方式,但现在这可以做到。

@records = joins(:category_typed).select('categories.id').where('category_types.name LIKE ?, "%#{search}%") 
where(id: @records.ids) 
0

我想你正在寻找的是

CategoryType.where(fk: CategoryType.where('category_types.name LIKE ?', "%#{search}%").select(:fk)) 

,这将产生以下须藤SQL

SELECT 
    category_types.* 
FROM 
    category_types 
WHERE 
    category_types.fk IN (
    SELECT 
     category_types.fk 
    FROM 
     category_types 
    WHERE 
     category_types.name LIKE '%JOHN%' 
    ) 
+0

感谢您的回复,不确定这是否会像我在Category中那样工作,我仍然希望得到主表的结果。 –

相关问题