调用 has_one 时的奇怪查询
Strange query when calling has_one
问题:Message
class 与 has_many :through
关系和 has_one
关系都与 User
class.当我尝试使用 has_one 关系时收到一个奇怪的查询。
我有一个 Message
class 与 User
到 message_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
问题:Message
class 与 has_many :through
关系和 has_one
关系都与 User
class.当我尝试使用 has_one 关系时收到一个奇怪的查询。
我有一个 Message
class 与 User
到 message_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