2017-04-10 5 views
0

私にはArticle、User、Approvalという3つのモデルがあります。これは、これが3つのモデル多面体レールについて

class User < ApplicationRecord 
    has_many :approvals  
    has_many :articles, dependent: :destroy 
end 

class Article < ApplicationRecord 
    belongs_to :user 
    has_many :approvals, as: :approvable 
end 


class Approval < ApplicationRecord 
    belongs_to :user 
    belongs_to :approvable, polymorphic: true 
end 

今、私は記事のショーのページで承認画像を表示したい、とCURRENT_USERは、記事を承認した場合、それは応じdiffenrenceだある

def change 
    create_table :approvals do |t| 
    t.references :user, foreign_key: true 
    t.references :approvable, polymorphic: true 

    t.timestamps 
    end 
end 

承認テーブルであります、私はこれを行うには非常にイージーな方法があると思いますが、私は唯一のように、これを行う に愚かな方法を考え出すことができます。

<% @article.approvals.each do |approval| %> 
    <% if approval.user_id == current_user.id %> 
    # show has approvaled image 
    <% end %> 
<% end %> 

私は多分それを考えるinefficiエン、より良い解決策を教えてください、ありがとう! :)

おそらく、私は非常によく表現していない、私は承認が賞賛などの意味ですか?

答えて

0

まず、current_userとarticleに属する承認を確認できます。

controller方法の使用中のSO

(一度に一つだけの記事を持って考えると)、

@current_user_approvals = Approval.where(user_id: current_user.id, article_id: @article.id) 

、その後、多形、この場合には使用すべきではない

<% @current_user_approvals.each do |approval| %> 
    # show has approval image 
<% end %> 
+0

'承認'モデルには 'article_id'属性がありません... – Dearest

0

、として@current_user_approvals in viewを使用しています。あなたはhas_many:throughを使用して承認を得ることができます。ドキュメントhere

を読んで、移行は次のようになります。私たちは(レールコンソールで)トリックを行うことができます今すぐ

class User < ApplicationRecord 
    has_many :articles, dependent: :destroy 

    has_many :approvals 
    has_many :approved_articles, through: :approvals, source: :article 
end 

class Article < ApplicationRecord 
    belongs_to :user 

    has_many :approvals 
    has_many :approved_users, through: :approvals, source: :user 
end 

class Approval < ApplicationRecord 
    belongs_to :user 
    belongs_to :article 
end 

:よう

class CreateApprovals < ActiveRecord::Migration[5.0] 
    def change 
    create_table :approvals do |t| 
     t.belongs_to :user 
     t.belongs_to :article 
    end 
    end 
end 

モデルは以下のようになり

# create a user 
user = User.create(name: 'user') 
# create an article 
article = user.articles.create(name: 'article') 

# check whether article is approved 
user.approved_articles.include?(article) # => false 
# approve the article 
user.approved_articles << article 
# check check whether article is approved again 
user.approved_articles.include?(article) # => true 

編集したバージョン私たちは承認のために多型を使用したいからです。鍵はsource_typeを使用して多態型を指定することです(この場合は 'Article'です)。

class User < ApplicationRecord 
    has_many :articles, dependent: :destroy 

    has_many :approvals 
    has_many :approved_articles, through: :approvals, source: :approvable, source_type: 'Article' 
end 

class Article < ApplicationRecord 
    belongs_to :user 

    has_many :approvals, as: :approvable 
    has_many :approved_users, through: :approvals, source: :user 
end 

class Approval < ApplicationRecord 
    belongs_to :user 
    belongs_to :approvable, polymorphic: true 
end 

上記のコンソールテストはまだ動作しています。

+0

ええ、私のプロジェクト全体で、多くのモデルが承認されています。私は合計コードを表示しませんでした。 ?(記事) 'メソッドを使用していますが、多態性を使用するとどうなるのか分かりません。 – Dearest

+0

@Diarest承認時に多型を使用することは理にかなっています。私は答えを更新しました。 – lainuo

関連する問題