【问题标题】:Active Record Query - Has many through associationActive Record Query - 有很多通过关联
【发布时间】:2012-04-29 02:37:33
【问题描述】:

我正在尝试在我的模型中编写活动记录查询以进行高级搜索。

我有一个公司模型,每个公司都有很多分类

目前,我的搜索方法中内置了以下内容。

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'

非常感谢。

罗斯

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 search activerecord


    【解决方案1】:

    您正在尝试对firms 返回的数组运行categories 方法,但该方法将失败。我假设您想返回具有给定类别 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
    

    【讨论】:

      【解决方案2】:

      将您的 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
      

      【讨论】:

      • 嗨 Eric,感谢您的回复,但它似乎仍然抛出错误:未定义的方法 `categories'
      猜你喜欢
      • 1970-01-01
      • 2013-12-25
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多