Ruby on Rails模型关联问题

时间:2013-02-07 21:17:02

标签: ruby-on-rails rails-activerecord model-associations

对于模糊的标题感到抱歉,但在一个句子中解释有点多了。

我有三个型号,User,Device和DeviceMessage。他们的关系非常简单:

  • 用户has_many :devices
  • 设备belongs_to :user
  • 设备has_many :device_messages
  • 和DeviceMessage 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

1 个答案:

答案 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 %>