【发布时间】:2015-09-06 01:50:29
【问题描述】:
刚开始在 Rails 4 项目中使用 STI。假设我有User 和Blog,并且User 可以将他的非公开博客以editors 或normal viewers 的身份分享给其他一些用户。
将type 列放在users 表中对我来说没有意义,因为在项目中,用户不仅与blogs 相关联,还与posts 之类的事物相关联。 (这里的博客更像是一个平台,帖子是文章。这里只是一个想法,可能是其他两件事。
所以我使用了另一个名为BlogUserAssociation 的模型来管理上述共享关系。基本上这个模型包含一个type 列,我继承了BlogEditorAssociation 和BlogViewerAssociation。 (名字有点笨拙。)第一个问题,这是处理“共享”情况的推荐方法吗?
有了上面的想法,我有:
# blog.rb
class Blog < ActiveRecord::Base
...
has_many :blog_user_associations, dependent: :destroy
has_many :editors, through: :blog_editor_associations, source: :user
has_many :allowed_viewers, through: :blog_viewer_associations, source: :user # STI
...
和
# user.rb
class User < ActiveRecord::Base
...
has_many :blog_user_associations, dependent: :destroy
has_many :editable_blogs, through: :blog_editor_associations, source: :blog
has_many :blogs_shared_for_view, through: :blog_viewer_associations, source: :blog
...
但是当我尝试使用 Rspec 进行测试时,
it { should have_many(:editors).through(:blog_editor_associations).source(:user) }
我收到了错误undefined method 'klass' for nil:NilClass
我相信这是因为我在User 中没有说has_many blog_editor_associations。但我想既然blog_editor_associations继承自blog_viewer_associations,我就不必再为子模型说has_many了。那么是否有理由不自动将has_many 绑定到子模型?
【问题讨论】:
标签: ruby-on-rails activerecord rspec