调用 has_one 时的奇怪查询

Strange query when calling has_one

问题:Message class 与 has_many :through 关系和 has_one 关系都与 User class.当我尝试使用 has_one 关系时收到一个奇怪的查询。

我有一个 Message class 与 Usermessage_memberships 有 has_many 关系。 Message 的每个实例以及通过 has_many through 关系让用户 link 访问它的每个实例都有一个也是 User 的创建者。

由于懒惰,我开始在 Message 实例的 creator_id 列中记录创建者 ID(下图)。每次创建消息时,我都会将创建者 ID 添加到列中。每次我想引用创作者时,我都会调用 User.find(message.creator_id)。我正在寻找在创建者列和用户之间创建一个 link,但我找不到正确的实现。

我遇到的问题是引用 has_one 关系中的 :creator_id 列。我会假设这样的事情会起作用

Message.rb

has_one :creator, -> { where id: :creator_id }, class_name: 'User'

但是每当我查找 message.creator 时调用的查询是这个

SELECT  "users".* FROM "users"  WHERE "users"."message_id" = ? AND "users"."id" = 'creator_id' LIMIT 1  [[nil, 26]]

我不完全确定 WHERE "users"."message_id" = ? 在哪里。没有它,看起来查询会很好。我不知道如何阻止它发生。

架构

create_table "messages", force: true do |t|
  t.string   "title"
  t.string   "contents"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.string   "token"
  t.integer  "creator_id"
  t.string   "link"
end

如有任何帮助,我们将不胜感激

试试这个设置:

class Message
  belongs_to :creator, class_name: '::User', foreign_key: :creator_id
end

class User
  has_many :authored_messages, class_name: '::Message', inverse_of: :creator
end