【问题标题】:How to sanitize join params inside a controller in Rails 4?如何在 Rails 4 中清理控制器内的连接参数?
【发布时间】:2018-02-28 22:04:02
【问题描述】:

这是在 Rails 4 中清理控制器内的“加入”参数的最佳方法吗?

假设:

user_name = params[:user_name]

.

# That's the only way that I can figure this out:
@result = Agenda.joins("LEFT JOIN meetings AS me ON meetings.agenda_id = agendas.id WHERE me.name = #{Agenda.sanitize(user_name})"

我已经尝试过了,但没有用,因为 'joins' 需要在每个 ',' 之后使用表格:

@result = Agenda.joins("LEFT JOIN meetings AS me ON meetings.agenda_id = agendas.id WHERE me.name = ?", user_name)

注意: 这只是解释问题的一小段代码,在完整的代码中我真的必须使用 LEFT JOIN。

【问题讨论】:

  • 去掉WHERE子句,然后可以添加,比如Agenda.joins('LEFT JOIN meetings ON meetings.agenda_id = agendas.id').where('meetings.name = ?', user_name)
  • 为什么不使用Agenda.joins(:meetings).where(meetings: { name: user_name })
  • 这让我很好奇:我遇到了这个问题,最终的共识似乎是 DB 在 WHERE 条件内部和外部的查询上很可能具有相同的性能。见stackoverflow.com/questions/1018952/…
  • 感谢 cmets 关于查询,我真的会考虑使用 'where' 重写它们。

标签: sql ruby-on-rails join controller sanitize


【解决方案1】:

我找到了一个更好的解决方案

Model.send(:sanitize_sql_array, )

例如:

user_name = params[:user_name]

join = "LEFT JOIN meetings AS me 
        ON meetings.agenda_id = agendas.id 
        WHERE me.name = ?", user_name)"

join = Agenda.send(:sanitize_sql_array,join)

@result = Agenda.joins(join)

在这种格式中,您可以对任何类型的查询使用任意数量的参数。

【讨论】:

  • 请注意,这是一种受保护的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多