用搜索查询方法

时间:2014-04-26 21:18:08

标签: sql ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我的模型中有这个小方法:

def date
    created_at.strftime('%d.%m.%Y')
end

现在我想借助这种方法执行搜索查询:

  @ebm_entry = @patient.ebm_entries.find(params[:id])
  @ebm_entries = @patient.ebm_entries.where(date: @ebm_entry.date)

但不知怎的.where(date: @ebm_entry.date) clausel不会工作,我得到这个错误:

ActiveRecord::StatementInvalid (PG::UndefinedColumn: FEHLER:  Spalte ebm_entries
.date existiert nicht
LINE 1: ...tries"  WHERE "ebm_entries"."patient_id" = $1 AND "ebm_entri...

我错了什么?感谢

2 个答案:

答案 0 :(得分:2)

以这种方式查询,您可以在相应的活动记录模型中编写范围,如下所示:

scope :dated,   lambda { |date| where(:created_at => date) }

使用此功能,您可以通过以下方式进行查询:

@ebm_entries = @patient.ebm_entries.dated(@ebm_entry.date)

Scope添加了一个用于检索和查询对象的类方法。范围表示数据库查询的缩小,例如本例where(:created_at => date)

Here更详细的范围及其在rubyonrails页面中的用法。

答案 1 :(得分:0)

很抱歉,但没有"按虚拟属性搜索" :)您只能搜索真实的数据库数据。

但是,您可以传递Date对象,而activerecord会自动将其转换为数据库日期字段。

所以实现你想要的东西会非常简单:

@ebm_entry = @patient.ebm_entries.find(params[:id])
@ebm_entries = @patient.ebm_entries.where(created_at: @ebm_entry.created_at)

事实上,格式化的东西应该是一个视图,与数据库中的数据无关。