Rails: получение случайного товара в нескольких категориях - PullRequest
0 голосов
/ 16 марта 2011

У меня есть вопрос о случайных записях в Rails 3. У меня есть две модели:

class Product < ActiveRecord::Base
  belongs_to :category

  self.random
    Product.find :first, :offset => ( Product.count * ActiveSupport::SecureRandom.random_number ).to_i
  end
end

class Category < ActiveRecord::Base
  has_many :products
end

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

class Product < ActiveRecord::Base
  belongs_to :category
  self.random cat=["Mac", "Windows"]
    joins(:categories).where(:categories => { :name => cat }).where(:first, :offset => ( Product.count * ActiveSupport::SecureRandom.random_number ).to_i)
  end
end

Кто-нибудь здесь, кто знает лучшее решение?

ТНХ! пингвин

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Вы можете попытаться упростить это немного:

class Product < ActiveRecord::Base
  def self.random(cat = nil)
    cat ||= %w[ Mac Windows ]

    joins(:categories).where(:categories => { :name => cat }).offset(ActiveSupport::SecureRandom.random_number(self.count)).first
  end
end

В Rails 3 есть много удобных вспомогательных методов, таких как offset и first, которые могут уменьшить количество аргументов, которые вам нужно передатьwhere.

Если у вас возникли проблемы с объединением, когда количество совпадающих продуктов меньше, чем общее количество продуктов, вам нужно использовать ORDER BY RAND().На самом деле в большинстве случаев это не так уж и много, и вы всегда можете проверить, работает ли он для вас.

0 голосов
/ 16 марта 2011

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

class Product < ActiveRecord::Base
  belongs_to :category
  self.random cat=["Mac", "Windows"]
    joins(:categories).where(:categories => { :name => cat }).order('rand()').first
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...