Как стать автором
Обновить

Комментарии 18

Здорово, что собрали всё в одном месте. Нашел немного нового для себя.
Алексей, спасибо, с none и becomes не доводилось столкнуться. Возьму на карандаш. Хотя сейчас не вижу где можно было бы попробовать. Если честно, то не ожидал, что бы будите постить статьи тех характера. Успехов!
Дык я стараюсь :) Буду и в своем блоге alec-c4.com что-то иногда писать :)
Например(про none):
каминари получает nil и дохнет
= paginate @objects получает nil и дохнет
проще один раз проверить и отдать пустой ActiveRelation чем во всех мыслимых мистах писать
— if @objects.presence
= paginate @objects
Вы конечно простите, я понимаю, что это пример, но за такое нужно пальцы ломать выговор делать.

@plain_pictures = PlainPicture.all

@plain_pictures.map ...


Для этого есть

#find_each
в этом куске речь шла про becomes если что :)
Я то понял :) Но ведь кто-то же может взять это в оборот.
find_each, кстати, добавит/заменит у вашего запроса order by, что естественно. а так же естественно что уберёт limit, если таковой есть.

Боюсь, что если возникнет надобность использовать find_each вместе с order и limit, то это в 99.9% будет код, за который можно смело руки вырвать.
«Hacks» подразумевает под собой использование неких скрытых возможностей или расширение оных. В вашем случае это скорее cheetsheet.
*cheat
Код, использующий pluck, можно упростить до

Article.pluck(:title)
согласен, да и как напомнил мне один из хабравчан — в 3й рельсе Article.all.pluck(:id) работать не будет так как all возвращает Array, а не AR Relation
Раз уж примеры для rails 4

where(["id not in (?)", checked.pluck(:id)])

упрощается до

where.not(id: checked.ids)
Для использования в rails3 есть такой workaround:

scope :none, where(:id => nil).where("id IS NOT ?", nil)

разве нельзя просто
scope :none, where('1=2')
?
Хотя, если есть джойны, наверное, не выйдет…
А есть ли способ элегантно объединять скоупы?
Например у пользователя есть скоупы received_messages, sent_messages. Можно ли сделать all_messages без непосредственного использования SQL-строки?
Может лучше вместо:
if i.class < Art then i.becomes(Art) else i end

Писать так:
i.class < Art ? i.becomes(Art) : i
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории