Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 3是条件=数组的查询的正确形式_Ruby On Rails_Ruby_Arel - Fatal编程技术网

Ruby on rails Rails 3是条件=数组的查询的正确形式

Ruby on rails Rails 3是条件=数组的查询的正确形式,ruby-on-rails,ruby,arel,Ruby On Rails,Ruby,Arel,我在实现我的第一个HABTM关系时遇到了一个问题 我希望验证我的方法,看看我是否在AREL(或Rails的其他部分)代码中发现了错误 我有以下型号 class Item < ActiveRecord::Base belongs_to :user belongs_to :category has_and_belongs_to_many :regions end class Region < ActiveRecord::Base has_ancestry has_a

我在实现我的第一个HABTM关系时遇到了一个问题

我希望验证我的方法,看看我是否在AREL(或Rails的其他部分)代码中发现了错误

我有以下型号

class Item < ActiveRecord::Base
  belongs_to :user
  belongs_to :category
  has_and_belongs_to_many :regions
end

class Region < ActiveRecord::Base
  has_ancestry
  has_and_belongs_to_many :items
end
生成的sql是

"SELECT `items`.* FROM `items` INNER JOIN `items_regions` ON `items_regions`.`item_id` = `items`.`id` INNER JOIN `regions` ON `regions`.`id` = `items_regions`.`region_id` WHERE (region_id =  1)"
但是,如果数组中有多个项,并且我尝试在中使用

Item.joins(:regions).where(["region_id IN  ?", [1,2,3,4]])
ActiveRecord::StatementInvalid: Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1,2,3,4)' at line 1: SELECT `items`.* FROM `items` INNER JOIN `items_regions` ON `items_regions`.`item_id` = `items`.`id` INNER JOIN `regions` ON `regions`.`id` = `items_regions`.`region_id` WHERE (region_id IN  1,2,3,4)
生成的sql在末尾有一个错误

"SELECT `items`.* FROM `items` INNER JOIN `items_regions` ON `items_regions`.`item_id` = `items`.`id` INNER JOIN `regions` ON `regions`.`id` = `items_regions`.`region_id` WHERE (region_id IN  1,2,3,4)"
生成的代码的最后一部分应该是 (区域id位于(“1,2,3,4”))

如果我手动编辑sql并运行它,我会得到我期望的结果

因此,有两个问题:

  • 我对单值情况的方法正确吗
  • sql生成是一个错误还是我配置的东西不正确
  • 谢谢 艾伦

    无论您是否指定一个值或多个值,都应适用于所有情况

    原始查询无法工作的原因是您实际上需要指定有效的SQL。所以你也可以这样做

    .where('region_id IN (?)', [1,2,3,4])
    
    无论您是否指定一个值或多个值,都应适用于所有情况

    原始查询无法工作的原因是您实际上需要指定有效的SQL。所以你也可以这样做

    .where('region_id IN (?)', [1,2,3,4])
    
    你试过这个吗

    .where('region_id IN (?)', [1,2,3,4])
    
    形式?您需要()才能有效。

    是否尝试了

    .where('region_id IN (?)', [1,2,3,4])
    

    形式?您需要()才有效。

    其他响应者对于条件散列的使用是正确的,但之后遇到的具体问题与字段特定性有关: Mysql::错误:“where子句”中的未知列“items.region\u id”

    您试图基于“region_id”绘制一个条件,但由于您没有显式地给出一个表,所以默认情况下它使用“items”。听起来您的列实际上在“item_regions”表中。试试这个:

    where("item_regions.region_id IN (?)", [1,2,3,4])
    
    或者:

    where(:item_regions => {:region_id => [1,2,3,4]})
    

    关于条件散列的使用,其他响应者是正确的,但之后遇到的具体问题与字段特定性有关: Mysql::错误:“where子句”中的未知列“items.region\u id”

    您试图基于“region_id”绘制一个条件,但由于您没有显式地给出一个表,所以默认情况下它使用“items”。听起来您的列实际上在“item_regions”表中。试试这个:

    where("item_regions.region_id IN (?)", [1,2,3,4])
    
    或者:

    where(:item_regions => {:region_id => [1,2,3,4]})
    

    我认为在Arel中实现这一点最干净、最惯用的方法是嵌套哈希语法,它避免了字符串文本(以及任何对HABTM联接表的直接引用):


    我认为在Arel中实现这一点最干净、最惯用的方法是嵌套哈希语法,它避免了字符串文本(以及任何对HABTM联接表的直接引用):


    谢谢你的快速回答。我没说我也试过…'Item.joins(:regions).where(:region_id=>[1,2,3,4])'给出以下错误'ActiveRecord::StatementInvalid:Mysql::error:Unknown column'items.region\u id'在'where子句中:从
    items
    内部连接
    items\u regions
    上选择
    items\u id
    =
    items
    id
    内部连接
    区域
    区域
    标识
    =
    项目\区域
    区域\标识
    其中
    项目
    区域\标识位于(1、2、3、4)中。WHERE语句似乎将region\u id附加到项而不是items\u regions。我在问号附近的(?)-parens中遗漏了上面的问题。是的,我猜您在我的回答中也遗漏了它;)谢谢你的快速回答。我没说我也试过…'Item.joins(:regions).where(:region_id=>[1,2,3,4])'给出以下错误'ActiveRecord::StatementInvalid:Mysql::error:Unknown column'items.region\u id'在'where子句中:从
    items
    内部连接
    items\u regions
    上选择
    items\u id
    =
    items
    id
    内部连接
    区域
    区域
    标识
    =
    项目\区域
    区域\标识
    其中
    项目
    区域\标识位于(1、2、3、4)中。WHERE语句似乎将region\u id附加到项而不是items\u regions。我在问号附近的(?)-parens中遗漏了上面的问题。是的,我猜您在我的回答中也遗漏了它;)谢谢-没有比那些盯着代码看太久的人更瞎的了:-)谢谢-没有比盯着代码看太久的人更瞎的了:-)
    Item.joins(:regions).where(regions: { id: [1,2,3,4] })