剛剛開始使用STI和Rails 4項目。假設我有User
和Blog
和User
可以將他的非公開博客分享給editors
或normal viewers
。Rails:實現共享博客; has_many with STI:未定義方法'klass'for nil:NilClass
它沒有任何意義,我把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
到子模型的原因?
謝謝提醒範圍。這確實使代碼更簡單。所以你不需要BlogUser和Blog之間的任何繼承?示波器如何基本工作?只是想等看有沒有更多的建議。如果沒有,我會選擇你的 – zkytony
所以你的意思是添加一個can_edit列到用戶表?如果我在博客(更像是一個平臺)內部還有Post並且用戶可以分享其可編輯性會怎麼樣?基本上不只是對於博客 – zkytony
將'can_edit'列添加到BlogUser表。關於範圍的更多細節請看Rails指南:http://guides.rubyonrails.org/association_basics.html 至於你關於Post模型的問題,也許你可以把它變成另一個問題。 – zetetic