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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。