如何在 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】:
让我们将名称换成sender
和recipient
,这样会更容易理解。
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 模型