GithubHelp home page GithubHelp logo

ads's Introduction

test task to twinslash job

run rake db:seed, rake status:publish

ads's People

Contributors

yegorzdanovich avatar

Stargazers

 avatar

Watchers

James Cloos avatar  avatar

ads's Issues

Категории объявок

Давай добавим каждому объявлению тип: покупка, продажа, обмен в виде поля в самой модели Advertisement. Лучше всего для этого использовать enumerize или enum поле из рельсов 4.1 (http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html).

А те типы, что есть сейчас — это на самом деле категории, для которых мы можем менять названия: Авто, Недвижимость и др. Фильтрация по ним работает, только давай поменяем немного вид и сделаем примерно так:
screen shot 2014-04-17 at 12 08 02 pm и покажем количество объявлений в категории рядом с названием категории.

СУБД при разработке

Мы используем при разработке ту же СУБД, которая потом будет использоваться на продакшне. Это нужно из-за того, что функционал разных СУБД отличается и может случиться ситуация, когда в девелопменте работает, а на продакшне нет и трудно дебажить.

Советую использовать postgres и в девелопменте и в продакшне.

N+1 запросы

Если открыть главную страницу со списком всех объявок, то в консоли будет следующее:

  Category Load (0.2ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = $1 LIMIT 1  [["id", 2]]
  Category Load (0.2ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = $1 LIMIT 1  [["id", 4]]
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = $1 LIMIT 1  [["id", 4]]
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = $1 LIMIT 1  [["id", 4]]
  Category Load (0.3ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = $1 LIMIT 1  [["id", 3]]
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = $1 LIMIT 1  [["id", 4]]
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = $1 LIMIT 1  [["id", 2]]
  Category Load (0.2ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = $1 LIMIT 1  [["id", 1]]
  CACHE (0.0ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = $1 LIMIT 1  [["id", 4]]

Мы видим много повторяющихся запросов и запросы, у которых параметры отличаются на 1. Это и есть так называемые N+1 запросы: http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations.

Сортировка объявок

Нужно дать пользователю возможность сортировать по цене и дате подачи объявления.

Конфиги в репозитории

Хранить конфиги в репозитории - плохая практика. У все разработчиков могут быть разные настройки окружения и соответственно разные конфиги.

Что делают:
Создают примеры конфигов в папке config/examples (например, config/examples/database.yml), а сами конфиги удаляют из репозитория и добавляют в .gitignore для того, чтобы никто случайно их не закоммитил.

Тесты

Нужно написать интеграционные тесты для самого важного функционала:

  • создание объявок;
  • смена состояния пользователем и админом;
  • просмотр объявок только в определенной категории;
  • сортировка объявок.

sql и джойны

Код, выводящий список категорий с количеством объявок генерирует такие запросы:

  Category Load (0.3ms)  SELECT "categories".* FROM "categories"
   (0.3ms)  SELECT COUNT(*) FROM "advertisements" WHERE "advertisements"."category_id" = $1 AND ("advertisements"."status" IN ('published'))  [["category_id", 1]]
   (0.2ms)  SELECT COUNT(*) FROM "advertisements" WHERE "advertisements"."category_id" = $1 AND ("advertisements"."status" IN ('published'))  [["category_id", 2]]
   (0.1ms)  SELECT COUNT(*) FROM "advertisements" WHERE "advertisements"."category_id" = $1 AND ("advertisements"."status" IN ('published'))  [["category_id", 3]]
   (0.2ms)  SELECT COUNT(*) FROM "advertisements" WHERE "advertisements"."category_id" = $1 AND ("advertisements"."status" IN ('published'))  [["category_id", 4]]

Делать по запросу на каждую категорию очень не оптимально. Хорошо, что у нас реляционная база данных и она поддерживает джойны таблиц и функции агрегации.

Тебе нужно разобраться с тем, как эти джойны и аггрегации работают и как их использовать в данной ситуации. Если что-то будет непонятно - спрашивай.

slim и simple_form

Я советую перевести все формы на slim и использовать simple_form для построения форм. Это позволит избавится от таких сложностей: https://github.com/YegorZdanovich/ads/blob/5731020d7fdc388996ba07661010cc41075dffa4/app/views/advertisements/new.html.erb. Вместо

 <div class="control-group">
  <%= f.label "Price", :class => "control-label" %>
  <div class="controls">
    <%= f.text_field :price, :class => "text_field"%>
  </div>
</div>

можно будет писать

= f.input :price

и все работу по созданию лэйбл-тегов, добавления нужных в стиле в случае ошибок валидации и др. будет делать simple_form.

Настройка редактора

Настрой свой редактор так, чтобы он добавлял перевод строки в конце файла, если его нету и чтобы он удалял пробельные символы в конце строк, если они есть.

Картинки в репозитории

Paperclip по умолчанию все картинки загружает в public/system. В репозиторий они попадать не должны, т.к. у каждого, кто будет тестить загрузку картинок они будут свои. И со всеми картинками репозиторий будет много весить.

  1. Нужно удалить папку public/system и вычистить ее из репозитория так, как будто ее никогда и не было (так можно делать только на очень ранних этапах проекта, пока ты еще один разработчик и никто больше не склонировал репозиторий).
  2. Нужно добавить эту папку в .gitignore.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.