如何在Rails Active Records中为模型创建别名

时间:2014-01-21 00:22:51

标签: ruby-on-rails ruby

我有一个模型Author。我想为每个Article分配一个Author,但并非所有作者都是AdminUser(我的其他模型)。我如何设置模型关联,以便每篇文章都必须有作者但不是每个作者都必须拥有管理员权限?

如果我@article.author,即使它是AdminUser

,也会返回作者
class Author  < ActiveRecord::Base
  attr_accessor :first_name, :last_name
  has_many :articles

end

class AdminUser < ActiveRecord::Base

  attr_accessor :first_name, :last_name, #...a bunch of authentication params, passwords, salt, etc

  has_many :articles

end

我更喜欢的是没有必要说@ article.admin_user ..我想要总是说@ article.author ..但我希望能够问@ admin_user.articles。

3 个答案:

答案 0 :(得分:4)

有几种方法。

  1. 使用单表继承(STI)

    class User < ActiveRecord::Base
      has_many :articles
    end
    
    class Author < User
    end
    
    class AdminUser < User
    end
    
    class Article < ActiveRecord::Base
      belongs_to :user
    end
    

    这将要求users表包含所有后代使用的所有属性,并且需要type列,以便AdminUser记录记住其AdminUser

  2. 使用多态关联

    class Author < ActiveRecord::Base
      has_many :articles, as: :owner
    end
    
    class AdminUser < ActiveRecord::Base
      has_many :articles, as: :owner
    end
    
    class Article < ActiveRecord::Base
      belongs_to :owner, polymorphic: true
    end
    

    这要求articles同时包含owner_idowner_type(字符串)列。

答案 1 :(得分:1)

您是否认为,而不是制作AdminUser类,可能会将该功能转换为模块,混合或gem。文章和作者作为课程具有完美的意义。但是,您似乎希望作者具有管理功能,但只有部分时间。做这样的事情可能是:

class Author < ActiveRecord::Base
  # Only include properties if this particular author should have them
  if self.is_admin?
    has_admin_functions
  end
end

答案 2 :(得分:0)

为什么不使用author和admin标志创建单个用户类?