说我有一个表定义如下:
Entities has_many Images
Images has_one Entity
我在Images表中有一条记录,它没有entity_id的值,我想成为任何新实体的默认图像。
当我使用时:
@entities.images.find(:all, :conditions => ['image_type = ?', 'avatar])
如果当前实体没有图像,我希望返回Images表中的默认记录
这是可能的,如果是的话,怎么样?
感谢。
答案 0 :(得分:1)
您可以在Entity
模型中为此创建方法(最佳做法是为模型使用单数名称。)
class Entity
def avatar_images
avatars = images.find(:all, :conditions => ['image_type = ?', 'avatar'])
if avatars.empty?
avatars = Image.find(:all, :conditions =>
['entity_id is null and image_type = ?', 'avatar'])
end
avatars
end
end
然后在控制器中调用该方法以获取属于该实体的头像图像,或者如果没有,则获取默认图像。
@avatars = @entity.avatar_images
修改强>
将这种方法概括为接受图像类型作为参数可能是一个好主意,以使其更具通用性:
class Entity
def images_of_type(type)
list = images.find(:all, :conditions => ['image_type = ?', type])
if list.empty?
list = Image.find(:all, :conditions =>
['entity_id is null and image_type = ?', type])
end
list
end
end
然后在你的控制器中:
@avatars = @entity.images_of_type('avatar')
答案 1 :(得分:0)
如果你真的必须,你可以做下一段代码,虽然我不会真的推荐它:
class << self
def find (*arguments)
begin
result_set = super(*arguments)
rescue
result_set = []
ensure
result_set =
Image.find(:first,
:conditions =>['entity_id is null and image_type = ?', 'avatar']
) if result_set.blank?
end
result_set
end
end
我不建议这样做的原因是因为它修改了find()的正常工作方式,我建议简单地创建一个封装你想要做的事情的新方法,例如:
def find_or_default (*arguments)
begin
begin
result_set = Image.find(*arguments)
rescue
result_set = []
ensure
result_set =
Image.find(:first,
:conditions =>['entity_id is null and image_type = ?', 'avatar']
) if result_set.blank?
end
result_set
end
end