Так как на самом деле есть несколько avatar_assets
(по одному для каждого размера), вы должны сохранить его как has_many
ассоциацию.
class User < AR::B
has_many :avatar_assets, :conditions => ['filename like ?' '%avatar%'], :class_name => 'Asset'
named_scope :avatar_size, lambda { |size|
{ :conditions => [ "thumbnail = ?", size ] }
}
end
Альтернативой было бы поместить всю работу в именованную область:
class User < AR::B
named_scope :avatar_for, lambda { |user, options|
if options[:size]
{ :conditions => [ "filename like ? AND thumbnail = ?", user.login, options[:size] ] }
else
{ :conditions => [ "filename like ?", user.login ] }
end
}
end
это позволяет вам сказать
Asset.avatar_for(current_user, :size => :medium)
но не так круто, когда вы говорите
current_user.avatar_for( current_user, :size => :medium )
Вы можете добавить некоторые :avatar
, :avatar?
и т. Д. Методы для пользователя, чтобы очистить это.
Лично я советую вам проверить плагин Paperclip и полностью избежать этих проблем.
EDIT:
Для вашего комментария, чтобы создать условие типа "показывать мне комментарии пользователей, имеющих аватар", я не уверен, что это сделает. Вы могли бы создать такие отношения:
class Comment
named_scope :with_avatars, :include => { :user => :avatar_assets }, :conditions => [ 'assets.thumbnail = ?', :thumb ]
end
EDIT:
Поскольку вас интересует только кэширование, а не условия, мы можем отбросить массив условий:
named_scope :with_avatars, :include => { :user => :avatar_assets }
Я изменил код выше, чтобы сделать его более работоспособным. Главное отличие состоит в том, чтобы сделать «аватарность» активов легко запрашиваемой. Если вы можете обновить свои существующие значения avatar_assets, указав имя файла, включая шаблон «avatar- [login]», вы можете сделать набор условий статическим, что намного чище, чем необходимость всегда искать аватар на основе имени пользователя. Расширения ассоциации - это еще один способ решения этой проблемы, однако я не думаю, что вы сможете их связать или объединить с именованными областями.