あいまいなタイトルで申し訳ありませんが、文章で説明するには少し多すぎます。
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.first
2 番目のユーザーに新しく関連付けられた最初のデバイスに関連付けられた最初のメッセージが表示されます)。 current_user のキャッシュされたコピーではなく新しいコピーですが、クエリ API の一部であるuser.device_feed
メソッドが使用されているため、メソッドが呼び出されるたびにそれが発生するように思われるため、混乱しています...where()
何か案は?すべての回答に感謝します。
-んん