Answers:
Note.
where(:user_id => current_user.id, :notetype => p[:note_type]).
where("date > ?", p[:date]).
order('date ASC, created_at ASC')
或者您也可以将所有内容转换为SQL表示法
Note.
where("user_id = ? AND notetype = ? AND date > ?", current_user.id, p[:note_type], p[:date]).
order('date ASC, created_at ASC')
where()
。使用where()
自动转义输入。
where()
当使用上面显示的格式并使用问号代替变量时,该输入将自动转义,然后在函数调用中列出它们。以这种方式使用它并不安全:Note.where("date > #{p[:date]}")
where("user_id = ?",current_user.id)
风险要高于where(user_id: current_user.id)
合并两个都具有user_id
字段的模型的风险。使用原始SQL表示法意味着您需要自己包括表说明,例如:where("notes.user_id = ?",current_user.id)
。
如果遇到列名不明确的问题,可以执行以下操作:
date_field = Note.arel_table[:date]
Note.where(user_id: current_user.id, notetype: p[:note_type]).
where(date_field.gt(p[:date])).
order(date_field.asc(), Note.arel_table[:created_at].asc())
Rails 6.1在where
条件下为比较运算符添加了新的“语法” ,例如:
Post.where('id >': 9)
Post.where('id >=': 9)
Post.where('id <': 3)
Post.where('id <=': 3)
因此,您的查询可以重写如下:
Note
.where(user_id: current_user.id, notetype: p[:note_type], 'date >', p[:date])
.order(date: :asc, created_at: :asc)
这是PR的链接,您可以在其中找到更多示例。