Возврат записи по умолчанию, если другой связанной записи не существует - PullRequest
1 голос
/ 14 сентября 2011

Скажем, у меня есть таблица, определенная так:

Entities has_many Images  
Images has_one Entity

У меня есть запись в таблице изображений, которая не имеет значения для entity_id, который я хотел бы использовать в качестве изображения по умолчанию для любой новой сущности.

Когда я использую:

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

Я хотел бы, чтобы запись по умолчанию из таблицы изображений была возвращена, если для текущего объекта нет изображения

Возможно ли этои если да, то как?

Спасибо.

Ответы [ 2 ]

1 голос
/ 14 сентября 2011

Вы можете создать метод для этого в вашей модели 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

Edit:

Вероятно, хорошей идеей будет обобщение этого метода для принятия типа изображения в качестве параметра, чтобы сделать его более универсальным:

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')
0 голосов
/ 14 сентября 2011

Если вам действительно нужно, вы можете сделать что-то вроде следующего фрагмента кода, хотя я бы не очень рекомендовал это:

  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...