0

高度な検索のために、モデルにアクティブレコードクエリを書き込もうとしています。

私は会社モデルを持っており、各会社には分類による多くのカテゴリーがあります

現在、検索方法には次のものが組み込まれています。

def find_firms
    firms = Firm.order(:name)
    firms = firms.where("name like ?", "%#{name}%") if name.present?
    firms = firms.categories.find(id: category_id) if category_id.present?
end

私のカテゴリスキーマは次のようになります。

create_table "categories", :force => true do |t|
  t.text     "name"
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
 end

と私の分類

 create_table "categorizations", :force => true do |t|
   t.integer  "category_id"
   t.integer  "firm_id"
   t.datetime "created_at",  :null => false
   t.datetime "updated_at",  :null => false
 end

と私の検索フォームビュー

  <div class="field">
    <%= f.label :category_id, "Practice Area" %><br />
    <%= f.collection_select :category_id, Category.order(:name), :id, :name, include_blank: true %>
  </div>

私が間違っていることについて何か考えはありますか?

エラーが発生し続けると:

 undefined method `categories'

どうもありがとう。

ロス

4

2 に答える 2

1

find_firm関数を次のように変更します。

 def find_firms
    if category_id.present?
      if name.present?
        Firm.where("name like ?", "%#{name}%").joins("JOIN categorizations ON firms.id = categorizations.firm_id").where("categorizations.category_id = ?", category_id).order(:name)
      else
        Firm.joins("JOIN categorizations ON firms.id = categorizations.firm_id").where("categorizations.category_id = ?", category_id).order(:name)
    elsif name.present?
      Firm.where("name like ?", "%#{name}%").order(:name)
    else
      Firm.order(:name)
    end
  end
于 2012-04-17T18:12:00.667 に答える
1

categories返された配列でメソッドを実行しようとしていますが、firms失敗します。指定されたカテゴリIDの企業を返品することを想定しています。

def find_firms
  firms = Firm.order(:name)
  firms = firms.joins(:categories).
            where(:categories =>{ id : category_id}).uniq if category_id.present?
  firms = firms.where("name like ?", "%#{name}%") if name.present?
end
于 2012-04-17T18:30:52.143 に答える