gpt4 book ai didi

ruby-on-rails - ActiveRecord、has_many :through, 和多态关联

转载 作者:行者123 更新时间:2023-12-03 04:39:03 31 4
gpt4 key购买 nike

各位,

想确保我正确理解这一点。并且请忽略这里继承的情况(SentientBeing),尝试着眼于 has_many 中的多态模型:通过关系。也就是说,请考虑以下因素...

class Widget < ActiveRecord::Base
has_many :widget_groupings

has_many :people, :through => :widget_groupings, :source => :person, :conditions => "widget_groupings.grouper_type = 'Person'"
has_many :aliens, :through => :widget_groupings, :source => :alien, :conditions => "video_groupings.grouper_type = 'Alien'"
end

class Person < ActiveRecord::Base
has_many :widget_groupings, :as => grouper
has_many :widgets, :through => :widget_groupings
end

class Alien < ActiveRecord::Base
has_many :widget_groupings, :as => grouper
has_many :widgets, :through => :widget_groupings
end

class WidgetGrouping < ActiveRecord::Base
belongs_to :widget
belongs_to :grouper, :polymorphic => true
end

在一个完美的世界中,我想,给定一个小部件和一个人,做类似的事情:

widget.people << my_person

但是,当我这样做时,我注意到 widget_groupings 中“石斑鱼”的“类型”始终为空。但是,如果我执行以下操作:

widget.widget_groupings << WidgetGrouping.new({:widget => self, :person => my_person}) 

然后一切都按照我通常的预期进行。我认为我从未见过这种情况发生在非多态关联中,只是想知道这是否是该用例特有的,或者我是否可能正在关注一个错误。

感谢您的帮助!

最佳答案

有一个 known issue Rails 3.1.1 打破了这个功能。如果您遇到此问题,请先尝试升级,该问题已在 3.1.2 中修复

你已经很接近了。问题是您滥用了 :source 选项。 :source 应该指向多态belongs_to 关系。然后您需要做的就是为您尝试定义的关系指定 :source_type 。

对 Widget 模型的此修复应该可以让您准确地执行您想要的操作。

class Widget < ActiveRecord::Base
has_many :widget_groupings

has_many :people, :through => :widget_groupings, :source => :grouper, :source_type => 'Person'
has_many :aliens, :through => :widget_groupings, :source => :grouper, :source_type => 'Alien'
end

关于ruby-on-rails - ActiveRecord、has_many :through, 和多态关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1683265/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com