如何在 ruby​​ on rails 中命名外键?

Posted

技术标签:

【中文标题】如何在 ruby​​ on rails 中命名外键?【英文标题】:How denominate foreign-keys in rubyonrails? 【发布时间】:2020-02-24 19:07:06 【问题描述】:

我解释我的问题:

我有 2 个模型:

- User (id, firstname, lastname, deviceid, email, password);
- Message (id, fromuser, touser, description)

我想要外键:

-: fromuser (Message) -> id (User)
-: touser (Message) -> id (User)

在我的模型中:

USER
-> has_many :messages

MESSAGE
-> belongs_to :users

在我的架构迁移中:

create_table "messages", force: :cascade do |t|
t.string "description"
t.integer "fromuser"
t.integer "touser"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end

create_table "users", force: :cascade do |t|
t.string "firstname"
t.string "lastname"
t.string "deviceid"
t.string "email"
t.string "password"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end

两个外键如何工作? 如何在我的 messages_controller.rb 中解释这一点?

干杯。

【问题讨论】:

我认为您还需要一个模型...例如 Room 或 Conversation,它同时具有 fromuser_id 和 touser_id,然后将其与 Conversation has_many 消息相关联,并且用户有很多对话...等等等等... . @code_aks 我认为他不需要另一个模型,他可以只查询fromuser 是某个id 和touser 是某个id 的所有消息,然后按created_at 对它们进行排序。那是你的谈话 【参考方案1】:

让我们将名称换成senderrecipient,这样会更容易理解。

class User
  has_many :sent_messages,
     class_name: "Message",
     foreign_key: :sender_id
  has_many :recieved_messages,
     class_name: "Message",
     foreign_key: :recipient_id

  def conversation_with(other_user)
     Message.where(
       "(recipient_id = :a AND sender_id = :b) OR (recipient_id = :b AND sender_id = :a)", 
       a: self.id, b: other_user.id
     ).order(:created_at)
  end
end

class Message
  belongs_to :sender, class_name: 'User'
  belongs_to :recipient, class_name: 'User'
end

见:

How can I rename a database column in a Ruby on Rails migration?

【讨论】:

你太快了两分钟!一如既往,炸弹。

以上是关于如何在 ruby​​ on rails 中命名外键?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails Scaffolding:同一张表的两个外键

如何在 Ruby on Rails ActiveRecord 迁移中处理过长的索引名称?

在控制器中找不到命名空间内的 Ruby on Rails 模型

在 ruby​​ on rails 上重命名上传文件

Ruby on Rails 有超过 1 个不同的列外键到同一个表

Ruby on Rails:嵌套命名范围