質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

3101閲覧

scope 検索フォーム1つで複数のカラムを検索

takeke

総合スコア60

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/05/14 06:44

ecサイトを作成していて、注文の管理画面にてscopeで検索機能を追加したいのですが、複数のカラムを検索する方法がわからず質問させていただきました。

注文の管理画面がorders/indexになるのですが、注文情報には名前(name)と住所(address),注文したユーザー(user.name)があります。この名前とユーザーは別物になります。ここで検索フォーム使って上記3つの何かしらに引っかかる検索を実装したいのですが、今の所、nameかaddressのどちら1つしか検索できません。
なので上記3種類のデータを1つのフォームで検索するにはどうしたらよいでしょうか?

order.rb

class Order < ApplicationRecord PAYMENT_TYPES = ["現金","クレジットカード","注文書"] has_many :line_items, dependent: :destroy belongs_to :user validates :name, :address, :email,:user_id, presence: true validates :pay_type, inclusion: PAYMENT_TYPES default_scope -> { order(created_at: :desc) } scope :get_by_name, ->(name){ where('name like ?',"%#{name}%")} def add_line_items_from_cart(cart) cart.line_items.each do |item| item.cart_id = nil line_items << item end end def total_price line_items.to_a.sum { |item| item.total_price } end def total_count line_items.to_a.sum { |item| item.quantity} end end

orders_controller.rb

def index @orders = Order.paginate(:page => params[:page], :per_page => 10) respond_to do |format| format.html format.json { render json: @orders } end if params[:name].present? @orders = @orders.get_by_name params[:name] end end

orders/index.html.erb

<div> <%= form_tag(orders_path, method: "get") do %> <%= text_field_tag :name, params[:name], :size => "37" %> <%= submit_tag "検索" %> <% end %> </div>

schema.rb

ActiveRecord::Schema.define(version: 20180508113923) do create_table "carts", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "line_items", force: :cascade do |t| t.integer "product_id" t.integer "cart_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "quantity", default: 1 t.integer "order_id" end create_table "orders", force: :cascade do |t| t.string "name" t.text "address" t.string "email" t.string "pay_type" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "user_id" t.integer "product_id" t.integer "quantity" end create_table "users", force: :cascade do |t| t.string "name" t.string "password_digest" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "email" t.string "reset_digest" t.datetime "reset_sent_at" t.boolean "admin", default: false end end

order.rbにscopeの記述のったく同じでaddressに変えたものを書いた場合は検索は機能しませんでした。
参考に(http://morizyun.github.io/blog/rails-active-record-where-or-dinamic/)こちらで

class order < Active Record::Base attr_protected :id scope :search_names_or, lambda { |search_word| where("name = ? or address = ?", search_word, search_word) } end

というのも試したのですが、 attr_protected :idこちらが通りませんでした。

以上です。何かわかる方いましたらアドバイス宜しくお願いしますm(._.)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決できました!

自分でもちゃんと説明できないので拙いながらまとめてみます。
まづviewのformで引き出すparamsは共通のものにして、コントローラーに記述、あとモデルにの記述で複数カラムの場合カラムの検索部分を()で囲うといいっぽいです。以下実際の記述
order.rb

scope :search_by_keyword, -> (keyword) { where("(orders.name LIKE :keyword) OR (orders.address LIKE :keyword)", keyword: "%#{sanitize_sql_like(keyword)}%") if keyword.present? }

user.rbはORと()除いただけで書方は同じです
orders_controller.rb

def index if params[:q] relation = Order.joins(:user) @orders = relation.merge(User.search_by_keyword(params[:q])) .or(relation.search_by_keyword(params[:q])) .paginate(page: params[:page]) else @orders = Order.paginate(:page => params[:page], :per_page => 10) end end

view/orders/index.html.erb

<div> <%= form_tag(orders_path, method: :get) do %> <div> <%= search_field_tag "q", params[:q], placeholder: "キーワード検索" %> <span> <%= submit_tag "検索" %> </span> </div> <% end %> </div>

以上です。ありがとうございました!

投稿2018/05/14 12:14

takeke

総合スコア60

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問