【问题标题】:ActiveRecord STI Forreign Key Override for Associations关联的 ActiveRecord STI 外键覆盖
【发布时间】:2011-11-28 02:31:28
【问题描述】:

我有一些使用 STI 建模的继承。它有一个基类,就像这样:

class Tariff < ActiveRecord:Base
end

然后它有几个孩子:

def FlatRateTariff < Tariff
end

其中一个类有一个 has_many 关联:

def TimeOfUseTariff < Tariff
  has_many :tariff_periods, :dependent => :destroy
end

这是我在关联中指定的 TariffingPeriod 类:

class TariffingPeriod < ActiveRecord::Base
  belongs_to :time_of_use_tariff, :foreign_key => :tariff_id

  # i've also tried :belongs_to :tariff, :foreign_key => :tariff_id

  alias_attribute :time_of_use_tariff_id, :tariff_id # i've tried that just in case....
end

当我在我的控制器或视图中调用@tariff.tariffing_periods ActiveRecord 时会吐出如下内容:

SELECT * FROM `tariffing_periods` WHERE (`tariffing_periods`.time_of_use_tariff_id = 13)

如您所见,我的外键 (time_of_use_tariff_id) 不正确。有没有办法以某种方式覆盖这个外键或强制 ActiveRecord 生成正确的 SQL?我在 TariffingPeriod 中尝试过 :foreign_key 覆盖,但这无济于事......有什么想法吗?

【问题讨论】:

  • 您是否尝试将外键添加到 TimeOfUseTarrif has_many 关系?
  • 确实成功了!!不知道我可以将foreign_key覆盖放在“has_many”端......以为它只能放在belongs_to端,但它有效。您可以将其作为答案,以便我将其标记为已解决吗?
  • 是的,那个人过去曾绊倒我。很高兴它对你有用。
  • 这里也一样...这似乎违反直觉,不是吗?

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我猜你的解决方法是这样的:

def TimeOfUseTariff < Tariff
  has_many :tariff_periods, :dependent => :destroy, :foreign_key => :tariff_id
end

【讨论】:

    【解决方案2】:

    您需要将 class_name 指定为 belongs_to 端的一个选项...

    class TariffingPeriod < ActiveRecord::Base
      belongs_to :time_of_use_tariff, :foreign_key => :tariff_id, :class_name => "TimeOfUseTariff"
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多