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