【问题标题】:Rails Single Table Inheritance without "type" column没有“类型”列的 Rails 单表继承
【发布时间】:2010-01-14 17:20:54
【问题描述】:

我正在将一些功能移植到 Rails,并且正在使用一个用于 cmets 的现有表。

基本上,有两种类型的 cmets - profile cmets(photo_id 列为 null)和 photo cmets(photo_id 列设置为 photo 的 ID)

通过向表中添加类型字段,单表继承工作得很好,但我想知道是否有办法让我的单表继承在没有类型字段的情况下工作。根据 Rails API 文档,“如果您的表中没有定义类型列,则不会触发单表继承。在这种情况下,它将像普通子类一样工作,没有特殊的区分魔法在它们之间或使用 find 重新加载正确的类型。”

我想知道是否有一种方法可以自定义我的模型以根据 photo_id 为 nil 或具有整数值来确定类型,而不是使用数据库列(如果我不使用,我宁愿不添加必须。)有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    如果 cmets 模型差别不大,我根本不会为单表继承而烦恼。只需添加:

    # to Comment model
    belongs_to :photo
    belongs_to :profile
    
    # to Profile model
    has_many :comments
    
    # to Photo model
    has_many :comments
    

    然后:

    @photo.comments # will return comments associated with photos
    @profile.comments # will return comments associated with profiles
    

    如果您同时设置了 photo_id 和 profile_id 可能会出现问题(我想当您评论与个人资料关联的照片时可能会发生这种情况),因此您可以在个人资料模型中进行更改:

    has_many :comments, :conditions => "photo_id is not null"
    

    给你另一种方法(我认为更好)polymorphic associations,但你需要修改你的 sql 表。

    【讨论】:

    • 谢谢!这非常适合我的目的。实际上,我最初采用了这种方法,但混淆了,因为我确实为某些行设置了 photo_id 和 profile_id ,而且我不知道 :conditions 选项。再次感谢!
    【解决方案2】:

    我怀疑你不能轻易做到这一点。但是,一种可能性是诱使活动记录使用视图而不是表,并编写一些数据库函数来根据设置的 id 设置此魔术属性。

    但是,最后,我怀疑只添加列会容易得多。

    【讨论】:

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