如果不存在其他相关记录,则返回默认记录

时间:2011-09-14 04:27:16

标签: ruby-on-rails ruby activerecord

说我有一个表定义如下:

Entities has_many Images  
Images has_one Entity

我在Images表中有一条记录,它没有entity_id的值,我想成为任何新实体的默认图像。

当我使用时:

@entities.images.find(:all, :conditions => ['image_type = ?', 'avatar])

如果当前实体没有图像,我希望返回Images表中的默认记录

这是可能的,如果是的话,怎么样?

感谢。

2 个答案:

答案 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