【问题标题】:Combine STI and polymorphic with rails 4将 STI 和多态与 rails 4 相结合
【发布时间】:2014-02-19 16:27:34
【问题描述】:

我在尝试将 STI 和多态关联与以下结构结合时遇到了一些问题:

class User < ActiveRecord::Base
end

class Runner < User
  has_many :subscriptions, as: :subscriber, :dependent => :destroy
  has_many :areas, through: :subscriptions
end

class Trainer < Runner
end

class Subscription < ActiveRecord::Base
  belongs_to :subscriber, polymorphic: true
  belongs_to :area
end

class Area
end

当我在控制台中尝试时:

Runner.find(2101).areas

SELECT "areas".* FROM "areas" INNER JOIN "subscriptions" ON "areas"."id" = 
"subscriptions"."area_id" WHERE "subscriptions"."subscriber_id" = $1 AND 
"subscriptions"."subscriber_type" = $2  [["subscriber_id", 2101], ["subscriber_type", 
"User"]]
 => #<ActiveRecord::Associations::CollectionProxy []> 

但是这个赛跑者有记录:

 #<Subscription id: 3, area_id: 2, subscriber_id: 2101, subscriber_type: "Runner", primary_area: true>

但我不明白为什么活动记录在寻找用户而不是跑步者。

知道为什么吗?还是更好的设计?

【问题讨论】:

标签: ruby-on-rails sti polymorphism


【解决方案1】:

来自 Rails 文档

结合单表使用多态关联 继承(STI)有点棘手。为了让协会 按预期工作,确保存储 STI 的基本模型 多态关联的类型列中的模型。接着说 对于上面的资产示例,假设有访客帖子和成员 将帖子表用于 STI 的帖子。在这种情况下,必须有一个 在帖子表中键入列。

像这样更改您的订阅类

class Subscription < ActiveRecord::Base
  belongs_to :subscriber, polymorphic: true
  belongs_to :area

  def subscriber_type=(sType)
     super(sType.to_s.classify.constantize.base_class.to_s)
  end
end

【讨论】:

    猜你喜欢
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多