对于模糊的标题感到抱歉,但在一个句子中解释有点多了。
我有三个型号,User,Device和DeviceMessage。他们的关系非常简单:
has_many :devices
,belongs_to :user
,has_many :device_messages
,belongs_to :device
。Rails提供了快速开始播放这些关联的方法,例如能够获取属于特定用户(来自任何设备)的所有设备消息。
为了做到这一点,我在用户模型中定义了一个方法:
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提要(是的,我遵循迈克尔哈特的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,设备名称 在左窗格中正确显示(这意味着设备与新用户正确关联),但<_> 未显示
。我已经使用Rails控制台验证设备消息应该显示(User.find(2).devices.first.device_messages.first
显示与第二个用户新关联的第一个设备关联的第一条消息) ,所以我知道我需要深入到数据库中来获取current_user的一个新的而不是缓存的副本,但是我很困惑,因为每次调用user.device_feed
方法时都应该发生这种情况,因为它是where()
的使用,它是查询API的一部分...
有什么想法吗?提前感谢任何和所有答案。
-MM
答案 0 :(得分:0)
我只是想知道为什么你有device_feed功能。对于您的Feed显示,您不仅可以像这样的循环,这是
class Device < ActiveRecord::Base
scope :in_new_message_order, :joins => :device_messages, :order => "created_at DESC"
end
添加了联合范围
class User < ActiveRecord::Base
...
has_many :devices, :as => : owner #Other entities may "own" a device
scope :in_sort_order, order("message_date DESC")
def device_feed
DeviceMessage.that_belong_to_user(self)
end
end
上面我添加了一个范围来对你的消息进行排序
<% user.devices.in_new_message_order.each do |device| %>
<% device.device_messages_in_sort_order.each do |message| %>
<%= ....render out the message %>
<% end %>
<% end %>