抱歉标题含糊不清,但一句话解释得有点多。
我有三个模型,用户、设备和设备消息。他们的关系相当简单:
- 一个用户
has_many :devices
, - 一个设备
belongs_to :user
, - 一个设备
has_many :device_messages
, - 和一个 DeviceMessage
belongs_to :device
。
Rails 提供了快速开始使用这些关联的方法,例如获取属于某个用户(从任何设备)的所有设备消息的能力。
为了做到这一点,我在 User 模型中定义了一个方法:
class User < ActiveRecord::Base
...
has_many :devices, :as => : owner #Other entities may "own" a device
def device_feed
DeviceMessage.that_belong_to_user(self)
end
end
我在 DeviceMessage 模型中定义了被调用的方法:
class DeviceMessage < ActiveRecord::Base
...
belongs_to :device
def self.that_belong_to_user(user)
device_ids = "SELECT owner_id FROM devices WHERE owner_id = :user_id
AND owner_type = \"User\""
where("device_id IN (#{device_ids})", user_id: user.id)
end
end
我定义了一个用户页面,他们可以在其中将设备与他们的帐户相关联(设备也有名称),并且在将设备添加到帐户后,它会将名称添加到左侧窗格中的设备名称列表中,同时显示用户的设备提要,就像 twitter 提要一样(是的,我遵循了 Michael Hartl 的 RoR 教程)。在这一点上,重要的是要注意我正在使用帮助函数来跟踪当前用户,因此当用户在登录时访问 root_path 时,我可以显示此信息。访问 root_path 时,root_path 的控制器被定义为那:
if user_signed_in?
@device_feed_items = current_user.device_feed.paginate(page: params[:page])
end
这一切都完美无缺!
所以……有什么问题?当我通过注册页面创建新用户并通过设备关联页面关联设备时,我被重定向到 root_path,设备名称正确显示在左窗格中(这意味着设备与新用户正确关联用户),但不显示 device_feed。
我已经使用 Rails 控制台来验证设备消息是否应该显示(User.find(2).devices.first.device_messages.first
显示与第一个设备相关联的第一条消息,该设备与第二个用户新关联),所以我知道我需要深入数据库才能获取current_user 的新副本而不是缓存副本,但我很困惑,因为每次user.device_feed
调用该方法时似乎都应该发生这种情况,因为它的使用where()
是查询 API 的一部分...
有任何想法吗?提前感谢您的任何和所有答案。
-毫米