【问题标题】:unknown class: Fixnum Rails MySQL query - inserting variable breaks my search未知类:Fixnum Rails MySQL 查询 - 插入变量会破坏我的搜索
【发布时间】:2015-05-03 02:42:09
【问题描述】:

我有一个运行良好的查询:

@schedule = Schedule.find(params[:id])    
@schedule_tasks = ScheduleTask.select("s.*, t.*, t.*, d.*, st.*").from("schedule_tasks st").
            joins("left join schedules s ON s.id = st.schedule_id").
            joins("left join tasks t ON t.id = st.task_id").
            joins("right join days d ON d.id = st.day_id").
            order("d.number, t.name").
            group_by{|d| d.number}

我不得不将搜索细化为仅具有特定 schedule_id 的 schedule_tasks,因此我将第二行编辑为:

joins("left join schedules s ON s.id = st.schedule_id AND s.id = ?", @schedule.id).

这会导致以下错误:

unknown class: Fixnum

如果我取出 group_by,错误就会消失 - 但我需要它,我已经尝试用数字而不是 @schedule.id 进行硬编码,但这也不起作用,谷歌搜索没有显示很多有关此错误的详细信息。

【问题讨论】:

  • 生成的查询是否正确,是否得到结果?
  • 在我将 schedule_id 插入第 2 行之前,查询工作正常,但现在在查询期间失败。
  • @schedule = Schedule.find(params[:id) 缺少 ]
  • 我认为您将“join”与“where”混合在一起...... where 子句应该与 join 子句分开。也许是joins("left join schedules s ON s.id").where("s.id = ?", @schedule.id) 的事件...
  • 我需要 join 的 where 子句,因为我需要整天返回。如果我执行单独的 where 子句,那么 days 表上的右连接将不再起作用。

标签: mysql ruby-on-rails fixnum


【解决方案1】:

对于来自 Google 的任何人,我使用纯字符串插值来解决此问题。此方法易受SQL Injection 的攻击,因此请确保在使用变量之前键入检查变量。

在这种情况下我会这样做

@schedule_id = @schedule.id
.
.
.
joins("left join schedules s ON s.id = st.schedule_id AND s.id = #{@schedule_id}")

【讨论】:

【解决方案2】:

您不能将@schedule_id 转换为字符串,而不是关注learning_to_swim's answer,正如前面提到的那样,它存在SQL 注入的风险?

@tasks = ScheduleTask.joins("left join [...] s.id = ?", @schedule.id.to_s)

【讨论】:

  • 它没有用。这不会返回operator does not exist: ? integer 错误吗?
猜你喜欢
  • 2012-06-15
  • 2013-07-11
  • 1970-01-01
  • 2015-02-12
  • 2013-07-27
  • 1970-01-01
  • 2011-12-16
  • 2019-09-26
  • 2012-07-24
相关资源
最近更新 更多