首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ruby关联--对很多人来说

Ruby关联--对很多人来说
EN

Stack Overflow用户
提问于 2022-03-01 01:09:07
回答 1查看 37关注 0票数 0

我能回顾一下我是否走上了正确的道路吗?我正在做一个小项目,以制作一个数字化的蜗牛邮件类型仿真器,很像一个缓慢的应用程序。我模拟的模式如下:

我很难解决的主要问题是如何处理与信件和收件箱有关的问题。收件箱需要容纳两个用户的user_ids

假设的逻辑是,只要当前用户向另一个用户发送信函,就会创建收件箱模型的唯一实例,发送方和接收方都可以访问该实例。

信件和收件箱的模式:

代码语言:javascript
运行
复制
    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

用户模型:

代码语言:javascript
运行
复制
    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匹配的字母列表。

信模型:

代码语言:javascript
运行
复制
    class Letter < ApplicationRecord
      belongs_to :user
      belongs_to :inbox
    end

收件箱模型:

代码语言:javascript
运行
复制
    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有效值:验证失败:用户必须存在

EN

回答 1

Stack Overflow用户

发布于 2022-03-01 05:53:48

如果您正在模拟蜗牛邮件,那么它实际上有一个给定的方向(或者它永远不会真正到达任何位置),并且收件箱模型实际上并不是必需的:

代码语言:javascript
运行
复制
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_lettersuser.sent_letters

如果您想要的模型实际上更像一个线程转换,您可以这样设置它:

代码语言:javascript
运行
复制
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 

这是一个更加灵活的模型,可以让会话拥有任意数量的用户。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71302706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档