2016-12-05 84 views
1

我想做一個應用程序,但我堅持如何設計模型。到目前爲止,我有這些型號:User,Post,Tag,Like,Comment。我爲每個模型,控制器,視圖和遷移文件創建。到目前爲止好,但現在我的問題是我應該做他們之間的關係或創建這些模型:PostTag,PostLike, PostComment。你知道,他們之間只有這些關係,所以當某個人在帖子中刪除了一個標籤時,他實際上只是刪除了關係而不是標籤本身,因爲標籤可能在另一個帖子中使用。Rails模型:如何做關係

+0

你能告訴我們你到目前爲止取得的成就?你有沒有遇到任何錯誤?有關模型關係的更多詳細信息,請參閱[本指南](http://guides.rubyonrails.org/association_basics.html)。 – 31piy

+1

您需要一個標籤和標籤模型。但對於喜歡,你可以使用多態關係,以便可以喜歡帖子和評論。哇,真是太棒了! –

回答

0

你不需要單獨的關係模型。只需將has_manybelongs_to添加到現有模型中,並將所需字段(post_id,user_id等)添加到數據庫表中即可。

如果您不會爲標記銷燬編寫代碼,那麼當您從帖子中刪除標記時,標記不會消失。本身沒有任何反應。

P.S.我建議使用acts-as-taggable-on gem代碼

0

您只需要添加Tagging模型,並使用多態關聯來處理Likes。所以,你需要一個UserPostCommentLikeTagTagging

您將不再需要爲標籤或引用的Tagging控制器或喜歡

如果你想users能夠創造postscomments爲以及likepostscomments,那麼這裏就是來配置你的模型的一種方法:

用戶模式:

class User < ActiveRecord::Base 
    has_many :posts 
    has_many :comments 
    has_many :likes, as: :likeable, dependent: :destroy 
end 

Post模型:

class Post < ActiveRecord::Base 
    belongs_to :user 
    has_many :comments 
    has_many :likes, as: :likeable, dependent: :destroy 

    has_many :taggings 
    has_many :tags, through: :taggings 

    def self.tagged_with(name) 
     Tag.find_by_name!(name).posts 
    end 

    def self.tag_counts 
     Tag.select("tags.*, count(taggings.tag_id) as count"). 
     joins(:taggings).group("taggings.tag_id") 
    end 

    def tag_list 
     tags.map(&:name).join(", ") 
    end 

    def tag_list=(names) 
     self.tags = names.split(",").map do |n| 
     Tag.where(name: n.strip).first_or_create! 
     end 
    end 

end 

評價模型:

class Comment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :post 
end 

像模型:

class Like < ActiveRecord::Base 
    belongs_to :likeable, polymorphic: true 
end 

標籤遷移發生器:

rails g model tag name 

標籤型號:

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :posts, through: :taggings 
end 

標記遷移發生器:

rails g model tagging tag:belongs_to post:belongs_to 

標籤模型

class Tagging < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :post 
end 

樁模型假定您的標籤使用的屬性:名稱

爲了訪問您的標記的帖子廣告d這條路

get 'tags/:tag', to: 'posts#index', as: :tag 

,改變你的索引操作在您的文章控制器這樣的:

def index 
    if params[:tag] 
     @posts = Post.tagged_with(params[:tag]) 
    else 
     @posts = Post.all 
    end 
end 

最後,將鏈接添加到您的收藏詢問看法是這樣的:

<%= raw @post.tags.map(&:name).map { |t| link_to t, tag_path(t) }.join(', ') %> 
+0

由於我對rails非常陌生,因此我需要一些時間來弄清楚你在那裏寫了些什麼。謝謝你到目前爲止! – Sylnois

+0

我有這個片段的問題:'Tag.find_by_name!(name).posts'。我得到這個錯誤:'未定義的方法'職位'#標籤:0x007fdc5a1c7260> – Sylnois