我的模型中有这个小方法:
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...
我错了什么?感谢
答案 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)
事实上,格式化的东西应该是一个视图,与数据库中的数据无关。