如何將其變爲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
編輯:從AnalogHole圖定位Freenode上#rubyonrails,我們可以這樣做:
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
...這是相當很酷,並且至少使語法更好一些。
但是,這仍然不像我想的那樣好。特別是,它不允許更好的發現鏈接(這樣它就不會執行這個查找,直到獲得所有條件)。
更重要的是,它不允許用於: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)
我其實看了回形針;它缺少一些我需要的更復雜的功能。 (資產在我的應用程序中很多地方使用,有時是多態的;每種資產類型有一個psuedocolumn會很糟糕。) – Sai 2009-06-07 20:50:02