3

個人の受信トレイメッセージシステムを作成しようとしていますが、いくつかの質問が頭に浮かびます。まず、私のシステムについて説明します。

これが私のテーブルモデルです

  create_table "inboxmessages", :force => true do |t|
    t.integer  "receiver_id"
    t.integer  "sender_id"
    t.integer  "message_id"
    t.boolean  "isread"
    t.boolean  "isstarred"
    t.datetime "created_at",  :null => false
    t.datetime "updated_at",  :null => false
  end

  create_table "messages", :force => true do |t|
    t.string   "subject"
    t.text     "body"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

関係は次のようになります

inboxmessages
  belongs_to :message
  belongs_to :user, :class_name => "User", :foreign_key => "sender_id"
  belongs_to :user, :class_name => "User", :foreign_key => "receiver_id"
messages
  has_many :inboxmessages
user
  has_many :inboxmessages

私が彼を抱えているという問題は、私に複数のユーザーを許可するメッセージを作成する方法がわかりません。ここに私が持っていることを試みているフォームのスキーマ

Message.subject
Inboxmessage.receiver # but have multiple different user
------------------------------------------------------------------------
Message.body
Inboxmessage.sender = current_user # hidden field

このモデル/コントローラー/アプリの構築に関して私が持っている質問は次のとおりです

1 - Should my new form be in inboxmessages or messages?
2 - Should I use accept_nested_for or should I use nested resources
3 - Is my model/database is okay or not the best?
4 - Are my foreign_key relationship well define?

前もって感謝します!!

4

2 に答える 2

4

私はこのようなことをします:

class User
  has_many :mailboxes
  has_many :messages, :through => :tags
  has_many :tags
end

class Message
  has_many :users, :through => :tags
  has_many :mailboxes, :through => :tags
  has_many :tags
end

class Mailbox
  has_many :tags
  has_many :messages, :through => :tags
  has_many :users, :through => tags
end

class Tag
  belongs_to :user
  belongs_to :message
  belongs_to :mailbox
  # this class has "read?", "starred", etc.
end

これにより、複数のユーザーの複数のメールボックスにメッセージを表示できるようになり、各ユーザーは独自の「既読?」、「スター付き」などを持つことができます。メッセージのコピー。つまり、メッセージは同じユーザーの 2 つ以上のメールボックスにありません。

スキーマを改善するには、Rails ガイドをお読みください。特に、次のような関連付けについて説明します。

  • 属する
  • has_one
  • 多くを持っています
  • has_many :を通して
  • inverse_of

Rails gemのacts-as-taggable- onも見てください

メッセージ スキーマを考える 1 つの方法は、「メッセージはメールボックスに属し、メールボックスには多くのメッセージがある」というものです (これは Yahoo のやり方です)。メッセージのもう 1 つの考え方は、「メッセージには多くのタグがあり、メールボックスは単にタグによる検索」です (これが Gmail のやり方です)。

ところで、Rubyメールgem は優れています。メッセージの作成に使用でき、from、to、cc などのヘッダーがどのように変換されるかを確認できます。

あなたは良い質問をしました:

  • 1 - 新しいフォームは受信トレイのメッセージとメッセージのどちらに配置する必要がありますか?

    私の意見では、メールのようなメッセージのモデル、メールボックス (またはタグ) のモデルがあれば、最大の利益が得られます。新しいメッセージを作成するには、通常、新しいフォームは ./messages/new.html.erb にあります。

  • 2 - accept_nested_for を使用する必要がありますか、それともネストされたリソースを使用する必要がありますか?

ネストされたリソースは問題ありません。こちらの Rails ガイドを参照してください。

http://guides.rubyonrails.org/routing.html#nested-resources

ネストされた属性も問題ありません。ここで API を参照してください。

経験則としては、1 レベルだけ下にネストすることをお勧めします。それ以降は、その価値よりも複雑になるからです。

  • 3 - 私のモデル/データベースは大丈夫ですか、それとも最適ではありませんか?

最高ではありません。通常、実際のメッセージには送信者と受信者がいます。しかし、inboxmessages テーブルで送信者と受信者をモデル化しています。has_many レシーバーを使用してメッセージをモデル化し、ユーザーのメッセージとのやり取りに別のモデルを使用することをお勧めします。たとえば、「starred」、「isread」などのフィールドを持つ「marks」と呼ばれるテーブルです。ユーザー。メッセージには has_many マークがあり、ユーザーには has_many マークがあります。

  • 4 -foreign_key 関係は適切に定義されていますか?

一般的に、はい。メールをモデル化するのは驚くほど難しいことに注意してください。経験則としては、外部キーにインデックスを付けることです。また、Rails の関連付け "inverse_of" を見て、それを使用してください。これは、速度とメモリの使用に役立ちます。

于 2012-08-27T18:34:07.900 に答える
1

クラスをこのようなものに設定します。

class Inbox
  has_many :messages
  belongs_to :user
end

class User
  has_many :messages
  has_one :inbox
end

class Message
  belongs_to :user
  belongs_to :inbox
  has_many recipients, class_name: "User", foreign_key: "recipient_id"
end
于 2012-08-27T18:46:30.610 に答える