これをどうやってhas_one関連にするのですか?ファインダメソッドをパラメータを使ってアソシエーションに変更する
(おそらくhas_oneの+サイズの名前付き範囲。)
class User < ActiveRecord::Base
has_many :assets, :foreign_key => 'creator_id'
def avatar_asset size = :thumb
# The LIKE is because it might be a .jpg, .png, or .gif.
# More efficient methods that can handle that are OK. ;)
self.assets.find :first, :conditions =>
["thumbnail = '#{size}' and filename LIKE ?", self.login + "_#{size}.%"]
end
end
EDIT:
はhas_many :assets, :foreign_key => 'creator_id' do
def avatar size = :thumb
find :first, :conditions => ["thumbnail = ? and filename LIKE ?",
size.to_s, proxy_owner.login + "_#{size}.%"]
end
end
...これはかなりです:Freenodeのの#rubyonrails上AnalogHoleからのキューイングは、我々はこれを行うことができますクールで、構文を少し上手くする。
しかし、これは私が望むのと同様に動作しません。特に、それは、より良いfind chaining(すべての条件が得られるまで、このfindを実行しないような)を可能にしません。
さらに重要なことは、:includeでの使用が許可されていないことです。私はポストと一緒に資産をキャッシュできるように...
PostsController
def show
post = Post.get_cache(params[:id]) {
Post.find(params[:id],
:include => {:comments => {:users => {:avatar_asset => :thumb}} }
...
end
:理想的には私はこのような何かをしたいです。または、まったくキャッシュしてください。 get_cache(user_id){User.find(user_id, :include => :avatar_assets)}
は良い最初のパスになります。
これは実際には(自己==ユーザー)動作しますが、精神で正しいことはありません。
has_many :avatar_assets, :foreign_key => 'creator_id',
:class_name => 'Asset', :conditions => ["filename LIKE ?", self.login + "_%"]
(またRefactor My Codeに掲載。)
私は実際にPaperclipを見ました。それは私が必要とするより洗練された機能のいくつかが欠けています。 (資産は私のアプリではあまり使われていませんが、多くの場所で、時には多態的に使用されます;資産タイプごとに1つのpsuedocolumnを持つことは悪いでしょう) – Sai
また、私は次のようなことを可能にする方法はありますか:Post.find(1).comments (:include => {:users => {:avatar_asset =>:thumb}})? – Sai
...また、AFAICTコードが機能しません。必要な:class_nameと:foreign_keyを追加しても、あなたのavatar_assets barfs: 'Unknown column 'users.asset_id'''は、それがどんなユーザーであるかを知らないためです。しかし、これが私をより良いものに導いてくれると思います。関連付けの拡張について再読する必要があります。 – Sai