你能比Rails 3搜索中的日期更好吗?

ben*_*ben 123 activerecord ruby-on-rails ruby-on-rails-3

我在Rails 3中搜索了这个:

Note.where(:user_id => current_user.id, :notetype => p[:note_type], :date => p[:date]).order('date ASC, created_at ASC')
Run Code Online (Sandbox Code Playgroud)

但我需要:date => p[:date]条件是等同的:date > p[:date].我怎样才能做到这一点?谢谢阅读.

Sim*_*tti 225

Note.
  where(:user_id => current_user.id, :notetype => p[:note_type]).
  where("date > ?", p[:date]).
  order('date ASC, created_at ASC')
Run Code Online (Sandbox Code Playgroud)

或者您也可以将所有内容转换为SQL表示法

Note.
  where("user_id = ? AND notetype = ? AND date > ?", current_user.id, p[:note_type], p[:date]).
  order('date ASC, created_at ASC')
Run Code Online (Sandbox Code Playgroud)

  • 西蒙娜的评论并不完全正确; `where()`当它以上面显示的格式使用时会自动转义输入,并带有问号代替变量,然后在函数调用中列出它们.以这种方式使用它是不安全的:`Note.where("date>#{p [:date]}")` (34认同)
  • 这是安全的,因为`where()`.使用`where()`自动转义输入. (7认同)
  • 另外值得注意的是,在合并具有`user_id`字段的模型的情况下,使用`where("user_id =?",current_user.id)`比where(user_id:current_user.id)`风险更大.使用原始SQL表示法意味着您需要自己包含表格说明,例如:`where("notes.user_id =?",current_user.id)`. (4认同)
  • 这样安全吗?我的意思是如果p [:date]来自用户输入,它是否会导致SQL注入? (2认同)

Sar*_*els 68

如果遇到列名不明确的问题,可以执行以下操作:

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())
Run Code Online (Sandbox Code Playgroud)

  • 出于某种原因,我在PostgreSQL服务器上使用Simone的"where"方法找不到列的错误,但它在SQLite中有效.你的方法适用于两者. (2认同)

小智 5

您可以尝试使用:

where(date: p[:date]..Float::INFINITY)
Run Code Online (Sandbox Code Playgroud)

相当于sql中的

WHERE (`date` >= p[:date])
Run Code Online (Sandbox Code Playgroud)

结果是:

Note.where(user_id: current_user.id, notetype: p[:note_type], date: p[:date]..Float::INFINITY).order(:fecha, :created_at)
Run Code Online (Sandbox Code Playgroud)

而我也改变了

order('date ASC, created_at ASC')
Run Code Online (Sandbox Code Playgroud)

为了

order(:fecha, :created_at)
Run Code Online (Sandbox Code Playgroud)