以下のようなモデルがあるとします。
class Order < ActiveRecord::Base has_many :items end class Item < ActiveRecord::Base belongs_to :order end
Orderに対してActiveScaffoldを設定して、検索する際にOrderの情報だけでなくItemのコードや名称も検索したい場合です。
field_searchでなく、通常のsearchならば
config.columns[:items].search_sql = "concat(items.code,' ',items.name)"
みたいな設定をしてitemsをsearch対象に入れてあげればOKです。
field_searchの場合で、itemsの一つのカラムだけであれば
同じように
config.columns[:items].search_sql = "items.code"
でできるのですが、items.codeとitems.nameの両方の検索用テキストボックスを表示したい場合は、以下のように
ダミーカラムを用意することと検索条件を上書きすることで、できるようになります。
ここではダミーカラム、item_codeとitem_nameを定義しています。このカラムはorders、itemsにも存在しないカラムです。
一部記述を省略しています。
class OrderController < ApplicationController active_scaffold :orders do |config| config.label = "オーダー管理" config.actions.exclude :search config.actions.add :field_search config.columns = [... :item_code, :item_name] ... config.columns[:item_code].label = "商品コード" config.columns[:item_code].search_sql = "" config.columns[:item_name].label = "商品名" config.columns[:item_name].search_sql = "" #ダミーカラムを表示しないようにします config.list.columns.exclude [:item_code,:item_name] config.show.columns.exclude [:item_code,:item_name] config.create.columns.exclude [:item_code,:item_name] config.update.columns.exclude [:item_code,:item_name] #ダミーカラムを検索で利用します。 config.field_search.columns = [:item_code,:item_name] config.field_search.text_search = false config.nested.add_link(:items,:label => "商品") end #ダミーカラムitem_codeを利用した検索条件 def self.condition_for_item_code_column(column, value, like_pattern) ["orders.id in (select distinct order_id from items where where code = ?))", value.strip] end #ダミーカラムitem_nameを利用した検索条件 def self.condition_for_item_code_column(column, value, like_pattern) ["orders.id in (select distinct order_id from items where where name = ?))", value.strip] end end
0 件のコメント:
コメントを投稿