1

default_scopeif ブロックの中に入れることができるかどうか知りたかったのです。has_oneそのプロファイルを作成する User モデルがあります。これは、ユーザー モデルにあるコードです。

Class User

default_scope joins(:profile).order('profiles.updated_at DESC').readonly(false)

end

問題は、データベースにプロファイルが作成されていない場合、プロファイルがゼロであるため、エラーが発生することです。次のように言うことができる if ブロックを使用できますか?

unless self.profile.nil?
 default_scope joins(:profile).order('profiles.updated_at DESC').readonly(false)
end

このアプローチに代わるものはありますか?

4

2 に答える 2

1

コメントで、あなたはすでに問題を解決していることがわかりますが、他の誰かがこれに出くわして疑問に思った場合に備えて、実際に尋ねた質問への回答を次に示します。

技術的には、はい、ブロックdefault_scope内で呼び出しを行うことができます。ただし、その条件は、クラスがロードされるときにテストされます (および適用されるかどうか) 。アプリケーションを起動したとき (または開発モードでリクエストが送信されたとき) を意味します。クラスの特定のインスタンスがまだ存在しないため、そのインスタンスのプロパティを調べることはできません。ifdefault_scope

短いバージョン: adefault_scopeは、モデルに基づくすべてのクエリに適用されるか、いずれにも適用されません。

于 2013-03-20T20:46:10.340 に答える
0

次のようなことができると確信しています:

default_scope lambda {
  unless profile.nil?
    joins(:profile).order('profiles.updated_at DESC').readonly(false)
  end
}

以下は、spree_landlord プロジェクトの例です。

于 2013-09-28T06:15:24.560 に答える