为什么ActiveRecord ::在哪里产生不正确的SQL?

时间:2016-04-01 00:22:47

标签: ruby-on-rails ruby-on-rails-4 activerecord

我正在尝试使用"其中"使用数字比较进行查询,如下所示:

above = BranchOption.where('order < ?', @branch_option.order).first

但它生成的SQL不起作用(注意缺少表信息和双引号):

SELECT  "branch_options".* FROM "branch_options" WHERE (order < 2)  ORDER BY "branch_options"."id" ASC LIMIT 1

如果我明确告诉我的电话,我可以得到我想要的答案,但这不是非常便携的:

above = BranchOption.where('"branch_options"."order" < ?', @branch_option.order).first
# >> SELECT  "branch_options".* FROM "branch_options" WHERE ("branch_options"."order" < 2)  ORDER BY "branch_options"."id" ASC LIMIT 1

一般来说,似乎行为正常,例如:

zeroes = BranchOption.where(order: 0)
# >> SELECT "branch_options".* FROM "branch_options" WHERE "branch_options"."order" = ?  [["order", 2]]

我正在使用rails 4.2.1和SQLite3(使用东海道在OSX中运行)。

相关表格(来自schema.rb)如下:

create_table "branch_options", force: :cascade do |t|
    t.text     "prose"
    t.integer  "order"
    t.integer  "origin_id"
    t.integer  "destination_id"
    t.datetime "created_at",     null: false
    t.datetime "updated_at",     null: false
end

add_index "branch_options", ["destination_id"], name: "index_branch_options_on_destination_id"
add_index "branch_options", ["origin_id"], name: "index_branch_options_on_origin_id"

模型branch_option.rb看起来像这样:

class BranchOption < ActiveRecord::Base
    belongs_to :origin, class_name: "Chapter", inverse_of: :branch_options
    belongs_to :destination, class_name: "Chapter"
end

任何帮助将不胜感激!我很久以来一直在寻找答案,但找不到任何答案。

2 个答案:

答案 0 :(得分:0)

当你提供一个sql rails的片段时,只需填写占位符 - 仅此而已。

特别是因为你的列名是一个sql关键字,你需要自己引用它。您可以使用ActiveRecord引用函数进行可移植的引用 - 连接类具有quote_column_name函数。

不幸的是,ActiveRecord生成的操作集不是很宽,尽管有squeel这样的库允许你表达更多的查询而不需要使用sql片段。尽管如此,它们确实会在轨道升级上中断,因为它们本质上与活动记录内部紧密耦合。

答案 1 :(得分:-3)

试试这个

above = BranchOption.where(["order < ?", @branch_option.order]).first