2017-10-10 6 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

レールコード

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'を共有することができます。したがって、 'John'の場合、結果は' Table1.find(1).table2s'となります。 –

答えて

0

を生成しますあなたが探していること

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

だと思いますそれらのIDは2番目のテーブルからレコードを返します。私はそれが一度にすべての結果を得る別の方法かもしれないと思っていますが、今のところこれが行います。

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

私はメインテーブルのレコードのすべてを返すクエリを実行してから使用してこれを解決した。これは、次のようにsudoの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

あなたの回答をありがとう、私がカテゴリーにいるときにこれが動作するかどうか確かめずに、メインテーブルからの結果が欲しい。 –

関連する問題