我能回顾一下我是否走上了正确的道路吗?我正在做一个小项目,以制作一个数字化的蜗牛邮件类型仿真器,很像一个缓慢的应用程序。我模拟的模式如下:
我很难解决的主要问题是如何处理与信件和收件箱有关的问题。收件箱需要容纳两个用户的user_ids 。
假设的逻辑是,只要当前用户向另一个用户发送信函,就会创建收件箱模型的唯一实例,发送方和接收方都可以访问该实例。
信件和收件箱的模式:
create_table "inboxes", force: :cascade do |t|
t.bigint "first_user_id", null: false
t.bigint "second_user_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["first_user_id"], name: "index_inboxes_on_first_user_id"
t.index ["second_user_id"], name: "index_inboxes_on_second_user_id"
end
create_table "letters", force: :cascade do |t|
t.integer "sender_id"
t.text "content"
t.integer "inbox_id"
t.time "delivery_time"
t.string "subject"
t.boolean "bottled"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
用户模型:
class User < ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :letters, through: :inboxes
has_many :inboxes
has_many :hobbies, through: :hobby_tags
end
信函模型将创建收件箱的ID以及随后给同一用户的信函,因此收件箱模型将有一个所有与其ID匹配的字母列表。
信模型:
class Letter < ApplicationRecord
belongs_to :user
belongs_to :inbox
end
收件箱模型:
class Inbox < ApplicationRecord
belongs_to :first_user, class_name: 'User'
belongs_to :second_user, class_name: 'User'
end
在Rails控制台上进行测试,我很难创建一个新的信函模型。当我传入一个用户实例时,sender_id是零,如果我将一个user.id传入字母中,它会返回用户ID,但在这两种情况下,我都无法.save!它进入数据库,因为它标志着用户必须存在。
> ActiveRecord::RecordIn有效值:验证失败:用户必须存在
发布于 2022-03-01 05:53:48
如果您正在模拟蜗牛邮件,那么它实际上有一个给定的方向(或者它永远不会真正到达任何位置),并且收件箱模型实际上并不是必需的:
class Letter < ApplicationRecord
belongs_to :sender, class_name: 'User'
belongs_to :recipient, class_name: 'User'
end
class User < ApplicationRecord
has_many :sent_letters,
class_name: 'Letter',
foreign_key: :sender_id
has_many :recieved_letters,
class_name: 'Letter',
foreign_key: :recipient_id
end
“收件箱”和“发件箱”实际上只是user.recieved_letters
和user.sent_letters
。
如果您想要的模型实际上更像一个线程转换,您可以这样设置它:
class Conversation
has_many :messages
has_many :users, through: :messages,
source: :sender
end
class Message
belongs_to :conversation
belongs_to :sender, class_name: 'User'
end
class User
has_many :conversations
# regardless of direction
has_many :messages,
through: :conversations
has_many :sent_messages,
class_name: 'Message',
foreign_key: :sender_id
has_many :penpals,
through: :conversations,
source: :users
end
这是一个更加灵活的模型,可以让会话拥有任意数量的用户。
https://stackoverflow.com/questions/71302706
复制相似问题