0

あいまいなタイトルで申し訳ありませんが、文章で説明するには少し多すぎます。

User、Device、DeviceMessage の 3 つのモデルがあります。それらの関係は非常に単純です。

  • ユーザー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 にリダイレクトされ、デバイス名左側のペインに正しく表示されます (つまり、デバイスが新しいユーザーに正しく関連付けられていることを意味します)。 user)、device_feed表示されません。

Rails コンソールを使用して、デバイス メッセージが表示されることを確認しました( User.find(2).devices.first.device_messages.first2 番目のユーザーに新しく関連付けられた最初のデバイスに関連付けられた最初のメッセージが表示されます)。 current_user のキャッシュされたコピーではなく新しいコピーですが、クエリ API の一部であるuser.device_feedメソッドが使用されているため、メソッドが呼び出されるたびにそれが発生するように思われるため、混乱しています...where()

何か案は?すべての回答に感謝します。

-んん

4

1 に答える 1

0

なぜあなたが device_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 %>
于 2013-02-07T22:14:30.353 に答える