1

背景情報:
モデル: アプリとアナウンス
アソシエーション: アプリ has_many アナウンス

状況: AnnouncementsController に非常に単純なインデックス アクションがあります。

def index
  app = App.find(params[:app_id])
  @announcements = app.announcements
end

jbuilder gem を使用して json を出力していたところ、@announcements 配列が空であることが示されましたが、その中にレコードがあることは確かです。ソースを確認したところ、「空?」続行する前にコレクションが空かどうかを確認するメソッド。私は何が「空?」を見たかったのですか?メソッドが返されるので、index アクションに次の行を追加しました。

def index
  app = App.find(params[:app_id])
  @announcements = app.announcements
  puts @announcements.empty?.to_s # Returns: "true"
end

「本当」は、データがあると確信しているため、期待していませんでした。そこで、@announcement 変数の内容を確認するために「inspect」呼び出しを追加しました。

def index
  app = App.find(params[:app_id])
  @announcements = app.announcements
  puts @announcements.inspect # Returns: "[#<Announcement id: 1, app_id: 1, title: \"20% off everything!\", content: \"Enjoy 20% off everything from now until yesterday!!...\", image: \"0e06b94d-1ac6-4d90-b937-9fa7bfaf90c9.jpg\", status: 0, created_at: \"2012-08-27 15:33:00\", updated_at: \"2012-08-27 15:33:00\">]"
  puts @announcements.empty?.to_s # Returns: "false"
end

うーん... 面白い。したがって、変数に「検査」を追加する以外は何も変更せずに、「空?」メソッドは異なる結果を返しました。

私が行ったもう1つの興味深い観察は、代わりにこれを行った場合:

def index
  @announcements = Announcement.all
  puts @announcements.empty?.to_s # Returns: "false"
end

「空?」うまくいきました。

他の誰かが同じ問題を抱えていますか、それとも私だけですか?

4

1 に答える 1

0

Rails はコレクションを遅延ロードするため、ロードを検査すると空ではなくなります。

于 2012-08-28T04:31:39.453 に答える