июля 21, 2012 | Published in Model, Ruby on Rails, Ruby on Rails 3
Статья будет иметь несколько хаотичной. В ней я приведу несколько примеров того, что я считаю неправильной работой с ActiveRecord. Что-то в статье — истина последней инстанции, а что-то — субъективное и, возможно, ошибочное мнение автора. Статья ориентирована на тех, кто хоть немного знаком с Ruby on Rails.
Очень популярная ошибка — не использование limit(1) для выборки одиночной записи с использованием where и других методов Quering API. Суть ошибки в том, что Rails не может за вас подумать о том, что вам необходима одна единственная запись, а не все удовлетворяющие условию. В случае, когда вы не используете limit(1) будет выполняться поиск по всей таблице, а не только до первой соответствующей условию записи.
Word.where(word: 'cat')
# Word Load (0.9ms) SELECT "words".* FROM "words" WHERE "words"."word" = 'cat'
# => [records]
Word.where(word: 'cat').limit(1)
# Word Load (0.7ms) SELECT "words".* FROM "words" WHERE "words"."word" = 'cat' LIMIT 1
# => [record]
UPD Вообще не пользуйтесь .limit(1), вместо .limit(1) используйте first, если вам действительно необходим лишь один элемент. Дело в том, что limit(1) возвращает массив с одним единственным элементом, чтобы получить этот элемент нам необходимо вызывать еще один метод — first (Array#first), или обращаться к элементу через индекс — Model.limit(1)[0].
Tag.limit(1).first
# Tag Load (1.6ms) SELECT "tags".* FROM "tags" LIMIT 1
Tag.first
# Tag Load (0.8ms) SELECT "tags".* FROM "tags" LIMIT 1
Read the rest of this entry »
июля 3, 2012 | Published in Ruby on Rails, Ruby on Rails 3
Всего 5 дней назад DHH добавил новый репозиторий организации Rails на Github. представляет собой расширение Rails проверенное на работоспособность только с Rails 3.2 и предназначенное для выDRYивания кода маршрутизации.
Принцип работы плагина простой, вы объявляете concern’ы, а в них помещаете код общий для нескольких ресурсов.
Read the rest of this entry »
июня 28, 2012 | Published in Ruby, Ruby Gems, Ruby on Rails, Ruby on Rails 3
– это альтернатива для всем известного Rake. Автором Thor является небезызвестный , хотя если посмотреть на коммиты в репозитории Thor, то Катц находится только на 4 месте, но сейчас не об этом. Thor – создавался как более изящная альтернатива фреймворку Rake и это вполне удалось его авторам. Я надеюсь, что по прочтению данной статьи вы не только научитесь работать с Thor, но и замените им Rake.
Для установки thor воспользуйтесь командой:
$ gem install thor
Если вы программируете с использованием фреймворка Ruby on Rails, то Thor уже уже установлен так как находится в зависимостях у Rails и используется внутри Rails для создания генераторов.
Установив Thor у вас появится возможность использовать в консоли команду thor:
$ thor -v
Thor 0.15.3
$ thor
Tasks:
thor help [TASK] # Describe available tasks or one specific task
thor install NAME # Install an optionally named Thor file into your syst…
thor installed # List the installed Thor modules and tasks
thor list [SEARCH] # List the available thor tasks (—substring means .*S…
thor uninstall NAME # Uninstall a named Thor module
thor update NAME # Update a Thor file from its original location
thor version # Show Thor version
Прежде чем создать первую задачу Thor вы должны быть знакомы с некоторыми соглашениями:
- Задачи Thor имеют расширение .thor
- Имена файлов в которых имеются задачи должны соответствовать именам классов.
- Классы используются в для создания пространств имен.
- Каждая задача – это просто метод.
Теперь мы можем приступить к созданию первой задачи. В файл first_task.thor поместим следующий код на Ruby:
Read the rest of this entry »
мая 6, 2012 | Published in CMS, QuasarLog, Ruby on Rails, Ruby on Rails 3
Что было сделано?
- Удалена сущность Document, а вместе с тем и понятие документов. В Quasar будут присутствовать ресурсы, например статья, продукт или топик форума — это ресурсы. Здесь понятие ресурс несколько отличается от ресурса REST архитектуры, точнее первое множество входит во второе. В общем, в Quasar вместо документов теперь ресурсы.
- Был добавлен первый ресурс — Article (статья). Он представляет собой какую-то совсем простую сущность, например пост в блоге или статью в новостном сайте. Для начала достаточно этой единственной сущности (ресурса), а затем мы добавим, например Product и Topic.
- Добавлена константа RESTYPES, которая хранит имена моделей — ресурсов Quasar CMS. Эти модели должны храниться в директории app/models/resources.
- Добавлена модель AttachmentLink, которая должна перелинковывать между собой ресурсы, точнее хранить связи между ресурсом и его вложениями (вложения — также ресурсы). Здесь и обнаружилась интересная проблема, о которой рассказано далее.
- Добавлены счетчики для attached/master ресурсов.
Read the rest of this entry »
апреля 26, 2012 | Published in Ruby on Rails, Ruby on Rails 3, Базы данных
Ассоциации между моделями ч. 1. В этой статьи мы поговорим об интересных параметрах и возможностях ассоциаций моделей.
Псевдонимы
Часто бывает необходимо или желательно использовать отличное от имени модели имя ассоциации. Например у нас есть две модели Store и User и у Store имеется владелец (seller — продавец). store.user выглядит не очень красиво, как буд-то речь идет о пользователе магазина, а не о его владельце (продавце), кроме того, у нас может быть несколько ассоциаций с моделью User, например у нас может быть buyer и seller.
Read the rest of this entry »
апреля 21, 2012 | Published in BDD, Development Processes, RSpec, Ruby, Ruby on Rails, Ruby on Rails 3, Базы данных, Основы, Тестирование
В этой статье мы рассмотрим:
- Установку Git
- Установку RVM - Ruby Version Manager для возможности работы с несколькими версиями Ruby, а также наборами библиотек Ruby - Gem’ами.
- Установку собственно Ruby: Ruby 1.8.7 и Ruby 1.9.3
- Установку SQLite, MySQL, PostgreSQL
- Установку фреймворка Ruby on Rails 3.2 и его зависимостей
- Установку Node.js как среду выполнения JavaScript
- Создание нового проекта Rails
- Работу с зависимостями проекта
- Настройку тестового окружения и написание простых спецификаций и тестов
- Написание кода приложения по спецификациям
- Установку Nginx и Unicorn, и запуск приложения Rails на Unicorn и Nginx прокси
- Работу с удаленным репозиторием
- Работу с Continuous Integration (CI) сервером - Travis
Read the rest of this entry »
апреля 15, 2012 | Published in Ruby, Ruby Gems, Ruby on Rails, Основы
Установить Ruby в Windows почти так же легко, как и в Ubuntu. Сразу хочу предупредить, что в работе Ruby под Windows имеется несколько ограничений, особенно это касается работы с файловой системой и процессами. Также не все библиотеки Ruby (gem’ы) отлично работают в Windows, например один из самых распространенных серверов для Rails — Unicorn заточен под Linux и совсем не работает под Windows.
Read the rest of this entry »
апреля 5, 2012 | Published in Ruby on Rails, Ruby on Rails 3, Базы данных
Ассоциации между моделями ч. 2. Экземпляры моделей представляют собой сущности реального мира, а ассоциации между ними являются ни чем иным как отношениями этих сущностей между собой.
ActiveRecord предоставляет несколько возможных ассоциаций (типов отношений) между моделями и все они представлены ниже.
belongs_to — принадлежность другой модели. Пример:
class Post < ActiveRecord::Base
belongs_to :category
end
Read the rest of this entry »
февраля 10, 2012 | Published in Ruby on Rails, Ruby on Rails 3, Базы данных
RubyDev — ваш друг в изучении Ruby и Rails!
Что такое модель?
Модель — это составляющая часть архитектурного паттерна MVC, которая хранит бизнес логику. В вашем приложении все модели должны храниться в директории app/models в отдельных файлах, имена которых должны соответствовать имени модели, например: Post -> post.rb, InvoiceProduct -> invoice_product.rb.
Как связаны модель и таблица?
В большинстве случаев модель ассоциируется с определенной таблицей в базе данных, например модель Post будет ассоциироваться с таблицей posts. Экземпляр модели являет собой объект представляющий одну запись из таблицы, а сама модель (класс) используется для работы со всей таблицей, например для поиска всех записей соответствующих некоторому условию.
Обратите внимание на то, как называется модель и как называется соответствующая ей таблица. Имя модели — всегда в едином числе, а имя таблицы во множественном.
Как создать модель?
Создать модель можно вручную, но лично я предпочитаю использовать генератор моделей:
$ rails g model Product name:string description:text price:integer
invoke active_record
create db/migrate/20120210115708_create_products.rb
create app/models/product.rb
invoke test_unit
create test/unit/product_test.rb
create test/fixtures/products.yml
Вызывая генератор я передаю в него в качестве аргументов имя модели и имена полей таблицы ассоциируемой с моделью вместе с типами данных этих полей (столбцов).
Генератор модели мне кажется более удобным потому, что одной командой я создаю сразу все необходимые для работы файлы: собственно модель, миграцию для создания соответствующей модели таблицы в БД, файл фикстур и болванку для написания тестов.
Read the rest of this entry »
февраля 9, 2012 | Published in Ruby on Rails, Ruby on Rails 3
RubyDev — ваш друг в изучении Ruby и Rails!
Миграции — это очень удобный инструмент для управления структурой базы данных без использования SQL.
Как работают миграции?
Миграции — это обыкновенные классы, которые наследуются от ActiveRecord::Migration, описывают структуру базы данных и хранятся в директории db/migrate/ вашего проекта. При использовании генератора scaffold или генератора моделей автоматически будет создан и класс миграции для создания соответствующей модели таблицы.
$ rails g model Post title:string content:text
В результате помимо создания самой модели будет создан еще и файл миграции следующего содержимого:
#db/migrate/20120126202608_create_posts.rb
class CreatePosts < ActiveRecord::Migration
def change
create_table :posts do |t|
t.string :title
t.text :content
t.timestamps
end
end
end
В предыдущих версиях Rails использовались методы self.up и self.down для соответственно выполнения и отката миграции. В Rails 3.1, как показано выше используется один единственный метод change вместо self.up и self.down. Методы up и down также доступны, но в большинстве случаев достаточно метода change.
Для выполнения миграций необходимо выполнить команду:
$ rake db:migrate
Запуск этой команды выполнит все имеющиеся миграции, что ранее не были выполнены. Read the rest of this entry »