Rails 3.1中的高级搜索查询

时间:2012-01-12 02:16:40

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

我想对任务模型执行高级查询(简化版本:

class Task
    belongs_to :user_task
    belongs_to :customer
end

class UserTask
    has_many :tasks
    belongs_to: :user
    attr_accessible :date
end

class Customer
    has_many :tasks
end

我想要构建的是de Task模型的搜索表单,其中包含以下字段:

  • from_date(日期字段):在 from_date之后
  • 对应UserTask的所有任务
  • to_date(日期字段):对应UserTask的所有任务 to_date之前
  • customers(集合为复选框):相应客户的所有任务都包含在客户选择中。

我创建了一个用于保存搜索的TaskSearch资源,可以想象一个用于查询数据库的大而丑的SQL字符串,但我不确定这是最好的方法。

哪个是ActiveRecord方法?

先谢谢。

1 个答案:

答案 0 :(得分:5)

class Task
  belongs_to :user_task
  belongs_to :customer

  scope :from_date, lambda { |date| joins(:user_task).where("user_tasks.date > ?", date) }
  scope :to_date, lambda { |date| joins(:user_task).where("user_tasks.date < ?", date) }
  scope :with_customers, lambda { |customer_ids| joins(:user_task).where("user_tasks.user_id IN (?)", customer_ids) }
end

希望这会奏效。问题是,当我们加入表格时,您可能会为同一任务获得多个结果。您可能必须在select()方法中添加一个distinct子句,如下所示:

select("DISTINCT tasks.*")