【发布时间】:2016-11-02 06:12:18
【问题描述】:
我有条件根据一些搜索关键字过滤/搜索帖子的标题和用户。
如您所见,这些值可用于以下两种类型的 where 条件:
Post.where('title ILIKE :keyword or user_name ILIKE :keyword', keyword: "%#{params[:search_keyword]}%")
Post.where('title ILIKE ? or user_name ILIKE ?', "%#{params[:search_keyword]}%", "#{%params[:search_keyword]}%")
第一个是直接在条件内部使用variable,第二个是使用? 符号。第一个对我来说很容易,如果有很多变量要比较,因为我可以声明一个变量并多次使用它。
谁能告诉我使用第一个或两者是否相同有任何缺点或安全问题?
谢谢:-)
【问题讨论】:
-
在我看来,第二个是最佳实践,而不是第一个。与其调用 Post.where,不如在辅助方法中编写过滤器并在 Post 或任何需要的地方调用该辅助器,这样会更好。
-
@Erica Bista 有什么理由认为第二个是最好的吗?
-
因为它更清晰并遵循搜索标准。它还允许您使用插值搜索每个文件,您想对代码执行什么操作。在第一个中,您正在搜索关键字并再次为该关键字插入一些内容。而在第二个中,您正在搜索带有值的标题。
-
@Dan 是的。我也更喜欢第一个,因为它使用起来既简单又干净。两者是否相同,第一个是否存在任何安全问题?
-
我认为两者都同样安全。您不想做的是在查询字符串中插入写入。
where('title ILIKE "%#{params[:search_keywords]}%"')我相信更容易受到恶作剧的影响。
标签: ruby-on-rails security ruby-on-rails-4 activerecord