2017-01-15 4 views
0

私はモデルアクティビティを持っています。そして私は、そのような私のウェブサイト上で起こっニュースやイベントの種類のモデルとしてそれを使用したい:一度に複数のオブジェクト/エンティティに関する情報を格納するための多態性

ユーザーが記事

ユーザーを作成したユーザーが持っている記事に

を編集しましたユーザーは常にユーザーへの接続であり、画像に

をアップロードしたコメント

を削除しました。そして何か他に:記事、ニュース、コメント、画像、プロフィール。これをどのように実装できますか?

Activity 
    belongs_to :with_activity, polymorphic: true 
    belongs_to :user 



Articles 
    has_many :activities, as :with_activity 

News 
    has_many :activities, as :with_activity 

しかし、私はすべての IDが関与してどのように私はを指定することになり、活動を作成しています:私はこれを行うことができますか?

例: 「ユーザーが記事にコメントを追加しました」。ここには3つのエンティティがあります。ユーザーIDは "belongs_to:user"によって取得されます。しかし、Comment IDまたはArticleのいずれかは、「belongs_to:with_activity、polymorphic:true」で取得され、両方ではありません。一方、私は両方が欲しいです。必要に応じて以上:

"記事の画像にコメントが追加されました"。 - 4つのエンティティがありますが、2つのIDだけがキャプチャです。私はすべてのIDを保存する必要があります。 "多形性"は、単一のエンティティのIDだけを格納することを可能にする。

どうすれば回避できますか?私は "belongs_to":picture、:article、:commentなどをアクティビティに追加する必要がありますか?より良い解決策はありますか?

私はそれに宝石を使用したくないことに注意してください。

答えて

1

通常は、with_activityへの関連付けが必要です。そこから既に存在するbelongs_toの関連付けに従うことができます(私は記事belongs_toという記事を想定しています)。例えば

# User creates a comment 
comment = user.comments.create(article: article, text: 'Lorem ipsum') 
# store the comment creation activity 
activity = user.activities.create(with_activity: comment, activity: 'created') 

今、あなたが活動をレンダリング知りたい:

<%= activity.user.name %>        # John Do 
<%= activity.activity %>        # created 
<%= activity.with_activity.class.to_s %>    # Comment 
"<%= activity.with_activity.text %>"     # "Lorem ipsum" 
on <%= link_to 'Article', user.with_activity.article %> # on <Article Link> 

またはあなたの他の例:A ユーザーが記事にコメントを追加しましたユーザーが記事の画像のコメントを追加しました がユーザーのアクティビティである場合

user_activity.with_comment.picture.acticle 

は対応する記事を返します。

+0

「この記事では、記事に属していると思います」 - はい、この特定の例でのみです。 – Otaffa

+0

複数のエンティティが互いに関連していない場合はどうなりますか? – Otaffa

+0

誰かがお互いに関係のない複数の活動をどのように行うことができるのか分かりませんか?私は、物事が接続される必要がある、またはユーザーが行う行動によって作成されたオブジェクトによって接続されると仮定します。そうでない例を投稿できますか? – spickermann

関連する問題