Comment transformer cette méthode en une association has_one?Modifier une méthode find avec w/parameters pour une association
(Peut-être has_one + portée du nom de taille.)
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: Cuing de AnalogHole sur #rubyonrails Freenode, nous pouvons le faire:
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
... ce qui est assez cool, et rend la syntaxe un peu mieux au moins.
Cependant, cela ne se comporte toujours pas aussi bien que je le voudrais. En particulier, il ne permet pas d'autres chaînages de recherche (de telle sorte qu'il n'exécute pas cette recherche tant qu'il n'a pas toutes ses conditions).
Plus important encore, il ne permet pas l'utilisation dans un: include. Idéalement, je veux faire quelque chose comme ceci:
PostsController
def show
post = Post.get_cache(params[:id]) {
Post.find(params[:id],
:include => {:comments => {:users => {:avatar_asset => :thumb}} }
...
end
... de sorte que je puisse mettre les actifs en cache avec la publication. Ou cachez-les du tout, vraiment - par exemple. get_cache(user_id){User.find(user_id, :include => :avatar_assets)}
serait un bon premier passage.
Cela ne fonctionne pas vraiment (auto == utilisateur), mais il est correct dans l'esprit:
has_many :avatar_assets, :foreign_key => 'creator_id',
:class_name => 'Asset', :conditions => ["filename LIKE ?", self.login + "_%"]
(. Également publié sur Refactor My Code)
J'ai effectivement jeté un coup d'oeil à Paperclip; il manque certaines des fonctionnalités les plus sophistiquées dont j'ai besoin. (Les actifs sont utilisés de façon non triviale dans mon application dans de nombreux endroits et parfois polymorphiquement, avoir un psuedocolumn par type d'actif serait mauvais.) – Sai
Aussi - est-il possible de faire quelque chose comme: Post.find (1) .comments (: include => {: users => {: avatar_asset =>: thumb}})? – Sai
... aussi, AFAICT votre code ne fonctionne pas. Même en ajoutant le nécessaire: class_name et: foreign_key, votre avatar_assets affiche: 'Unknown column 'users.asset_id''' car il ne sait pas sur quel utilisateur il se trouve. Mais je pense que cela m'amène à quelque chose de mieux; devra relire les extensions d'association. – Sai