Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.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
rails嵌套有许多外部作用域连接未命中到连接表:sql错误_Sql_Ruby On Rails_Ruby On Rails 4_Rails Activerecord_Has Many Through - Fatal编程技术网

rails嵌套有许多外部作用域连接未命中到连接表:sql错误

rails嵌套有许多外部作用域连接未命中到连接表:sql错误,sql,ruby-on-rails,ruby-on-rails-4,rails-activerecord,has-many-through,Sql,Ruby On Rails,Ruby On Rails 4,Rails Activerecord,Has Many Through,一个包含所有模型的自运行模板供您自己测试,可以在这个模板中使用-运行它并触发错误 要将其可视化,结构如下所示: Colors |n| |:| |1| ----- Houses n:n Conditions |n| ----- |:| |1| People 从空白DB开始创建一些测试数据(控制台命令,省略返回值以保持其清晰): 现在我有了一些测试数据。让我们找回此人的房屋(根据定义,这些房屋仅为受损房屋): 从sql字符串可以清楚地看出,缺少联接表conditions,因

一个包含所有模型的自运行模板供您自己测试,可以在这个模板中使用-运行它并触发错误

要将其可视化,结构如下所示:

Colors
  |n|
  |:|
  |1| -----
Houses n:n Conditions
  |n| -----
  |:|
  |1|
People

从空白DB开始创建一些测试数据(控制台命令,省略返回值以保持其清晰):

现在我有了一些测试数据。让我们找回此人的房屋(根据定义,这些房屋仅为受损房屋):

从sql字符串可以清楚地看出,缺少联接表
conditions
,因此
conditions.condition
不可用。如果我没有看错,那么前面查询中的字符串将丢失:

INNER JOIN "conditions_houses" ON "conditions_houses"."house_id" = "houses"."id"
INNER JOIN "conditions" ON "conditions"."id" = "conditions_houses"."condition_id"
因此,查询应该是:

SELECT "colors".* FROM "colors"
  INNER JOIN "houses" ON "colors"."house_id" = "houses"."id"
  INNER JOIN "conditions_houses" ON "conditions_houses"."house_id" = "houses"."id"
  INNER JOIN "conditions" ON "conditions"."id" = "conditions_houses"."condition_id"
  WHERE "houses"."person_id" = ? AND "conditions"."condition" = 'damaged'
这是rails bug还是我做错了?为什么缺少联接
条件

守则:

class Color < ActiveRecord::Base
    belongs_to :house
end

class Condition < ActiveRecord::Base
    has_and_belongs_to_many :houses
end

class House < ActiveRecord::Base
    has_many :colors
    belongs_to :person

    has_and_belongs_to_many :conditions

    scope :damaged, -> { joins(:conditions).where(:'conditions.condition' => 'damaged') }
end

class Person < ActiveRecord::Base
    has_many :damaged_houses, -> { damaged }, :class_name => "House"
    has_many :damaged_colors, through: :damaged_houses, :source => :colors
end
class Color{joins(:conditions).where(:'conditions.condition'=>'损坏')}
结束
类Person{损坏的房子,:class\u name=>“房子”
有很多:损坏的颜色,通过::损坏的房子,:source=>:颜色
结束

因此,我可以通过修改以下内容来运行您的要点:

has_many :damaged_colors, through: :damaged_houses, :source => :colors

正如评论中提到的那样,这似乎是HABTM关联上的一个
ActiveRecord
错误。。。希望这有助于同时


有趣的是,我将你的要点转换成了一个hm:hm,并且有同样的问题…

我很确定这是一个bug,它与典型的ActiveRecord关联的bug非常相似(例如,请参见)。如果你发布模型,它将帮助你提高1000倍,具体来说,使用的关联/方法确实衍生出了
损坏的颜色
@omarvelous请查看我的要点链接(你可以在我问题的顶部找到)@markus将你的bug带给人们,不要让人们去寻找你的bug。有趣。。。您是否碰巧有一个
人员。没有
损坏的
范围的颜色
,这是否有效?谢谢,这有助于现在运行代码,但显然重复了范围定义-因此这只能是一个临时解决方案。
SELECT "colors".* FROM "colors"
  INNER JOIN "houses" ON "colors"."house_id" = "houses"."id"
  INNER JOIN "conditions_houses" ON "conditions_houses"."house_id" = "houses"."id"
  INNER JOIN "conditions" ON "conditions"."id" = "conditions_houses"."condition_id"
  WHERE "houses"."person_id" = ? AND "conditions"."condition" = 'damaged'
class Color < ActiveRecord::Base
    belongs_to :house
end

class Condition < ActiveRecord::Base
    has_and_belongs_to_many :houses
end

class House < ActiveRecord::Base
    has_many :colors
    belongs_to :person

    has_and_belongs_to_many :conditions

    scope :damaged, -> { joins(:conditions).where(:'conditions.condition' => 'damaged') }
end

class Person < ActiveRecord::Base
    has_many :damaged_houses, -> { damaged }, :class_name => "House"
    has_many :damaged_colors, through: :damaged_houses, :source => :colors
end
has_many :damaged_colors, through: :damaged_houses, :source => :colors
has_many :damaged_colors, -> { joins({house: :conditions}).where(:'conditions.condition' => 'damaged') }, through: :damaged_houses, :source => :colors