调用has_one时出现奇怪的查询

时间:2015-01-16 10:28:41

标签: ruby-on-rails ruby activerecord

问题:Message类与has_many :through类有has_one关系且User关系。当我尝试使用has_one关系时获取一个奇怪的查询。

我有一个Message类,与Usermessage_memberships有一个has_many关系。 Message的每个实例以及通过has_many through关系与其关联的用户都有一个User的创建者。

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

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

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

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

尝试此设置:

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