rails动态在哪里sql查询
我有一个对象,有一堆属性代表可搜索的模型属性,我想只使用设置的属性动态创建一个SQL查询。 我创建了下面的方法,但我相信它容易受到sql注入攻击。 我做了一些研究并阅读了rails活动记录查询界面指南,但似乎where条件总是需要一个静态定义的字符串作为第一个参数。 我还试图找到一种方法来清理我的方法生成的sql字符串,但似乎没有一种好的方法可以做到这一点。
我怎么能做得更好? 我应该使用where条件还是以某种方式清理这个sql字符串? 谢谢。
def query_string to_return = "" self.instance_values.symbolize_keys.each do |attr_name, attr_value| if defined?(attr_value) and !attr_value.blank? to_return << "#{attr_name} LIKE '%#{attr_value}%' and " end end to_return.chomp(" and ") end
当你试图解决错误的问题时,你的方法有点偏差。 您正在尝试构建一个字符串以交给ActiveRecord,以便在您只是尝试构建查询时可以构建查询。
当你说的话:
Model.where('a and b')
这跟说:
Model.where('a').where('b')
你可以说:
Model.where('c like ?', pattern)
代替:
Model.where("c like '#{pattern}'")
将这两个想法与您的self.instance_values
结合起来,您可以获得如下内容:
def query self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)| q.where("#{name} like ?", "%#{value}%") end end
甚至:
def query empties = ->(_, v) { v.blank? } add_to_query = ->(q, (n, v)) { q.where("#{n} like ?", "%#{v}%") } instance_values.reject(&empties) .inject(YourModel, &add_to_query) end
这些假设您已将所有实例变量正确列入白名单。 如果你还没有那么你应该。
- Rails / Postgresql SQL差异w /日期
- Rails上的Ruby / PgSQL错误启动:无法加载这样的文件–pg_ext(LoadError)
- Rails:在同一个应用程序中同时使用mysql和postgres?
- 使用Ruby on Rails在PostgreSQL中使用interval
- 我无法将我的rails应用程序推送到Heroku /获取’pg’gem安装?
- 如何为heroku应用程序更改DATABASE_URL
- Rails和postgres – 在heroku上部署时忽略了pg gem
- 为什么我的Rails 4 / Postgres中的所有表都以1的“维度”创建?
- 将Postgres查询转换为Rails ActiveRecord?