• Как получить нужную релевантность результатов в поиске по multivalue полю?

    morr
    @morr Автор вопроса
    Отвечу сам на свой вопрос.

    Если хочется хранить массив названий в одном поле, то к "name" полю можно добавить "index_options": "docs", и количество вхождений слова перестанет влиять на релевантность.
    Так же можно добавить "norms": { "enabled": false } и общая длина строки перестанет влиять на релевантность.
    Но всё это костыли, которые не помогут для более сложных случаев, когда затем вам захочется сделать разные хитрые комбинации повышения/понижения релевантности для разных ситуаций.
    Например, с массивом названий не выйдет сделать буст релевантности при полном совпадении одного из названий с искомой фразой.

    Поэтому единственным подходящим вариантом вижу построение индекса таким образом, чтобы одно название товара "мапилось" на одну строку в индексе эластика.

    Для понимания того, как считается релевантность очень помогла статья Theory Behind Relevance Scoring.

    Так же для себя обнаружил, что на релевантность влияет, насколько часто встречается слово во всём индексе https://www.elastic.co/guide/en/elasticsearch/guid... И влияет оно порой очень сильно. Поэтому при реализации поиска по названиям idf фактор ранжирования стоит в обязательном порядке отключать https://stackoverflow.com/questions/33208587/elast... (работает в версии эластика начиная с 6.2)
    Ответ написан
    Комментировать
  • Как индексировать элементы для частого изменения очереди?

    Если у вас не постоянно изменяемые индексы по много раз в секунду, а так же не таблица из миллиона строк, то массовый апдейт всех индексов выше или ниже нового значения вполне хорошее решение.
    То есть если вы хотите вставить элемент и дать ему индекс 5, то перед вставкой вам нужно выполнить запрос
    upate table_name set position = position + 1 where position >= 5

    При такой схеме при удалении элемента ничего с остальными элементами делать не нужно.

    Решение оставлять "зазор между индексами" в 10-100-1000 и т.д., или делать индексы дробными совершенно не приемлимо. Оно не надёжно в долгосрочной перспективе.

    И да, если говорить о типовых задачах, то эта задача типовая.
    Есть хорошим гем acts_as_list, который делает как раз нужное. Использует он способ, который я описал ваше.
    Ответ написан
    3 комментария
  • Как прокинуть обратную связь между компонентами?

    Чтобы была обратная связь, вам из родительского компонента в дочерний нужно передать объект/строку/массив (не суть важно что именно), который дочерний компонент будет изменять.
    Привязка input к объекту делается через атрибут `v-model`.

    Будет ли при этом использоваться vuex или нет, это не важно, подход при этом никак не изменится. Без vuex вы передаёте объект, лежащий в родительском компонента, а с vuex будете брать объект из vuex хранилища.

    Немного отредактировал ваш пример
    Родитель
    <template lang="pug">
      form
        div you wrote: {{input_data.value != '' ? input_data.value : 'nothing'}}
        c_input(
          :input_data="input_data"
        )
        button Отправить
    </template>
    
    <script>
    import c_input from './test_2'
    export default {
      components: { c_input },
      data() {
        return {
          input_data: {
            name: Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5),
            append: '',
            value: '',
            placeholder: '',
            error: 'zz'
          }
        }
      }
    }
    </script>
    Потомок
    <template lang="pug">
      .form-group
        input(
          type="text"
          class="form-control"
          :class="input_data.append"
          v-model="input_data.value"
          :placeholder="input_data.placeholder"
          :name="input_data.name"
          :id="input_data.name"
        )
        label(
          :for="input_data.name"
          generated="true"
          class="error"
          v-if="input_data.error"
        ) error: {{ input_data.error }}
      </div>
    </template>
    
    <script>
      export default {
        props: {
          input_data: Object
        }
      }
    </script>


    На скриншоте выделил важные моменты что откуда куда передаётся take.ms/YvbyL
    take.ms/7uGdO
    Ответ написан
    Комментировать
  • Почему не работает "не" в ограничениях в роутинге rails?

    У вас `authorized` это лямбда. Тоесть это функция, которая будет выполняться каждый раз, когда запрос придёт в рельсы.
    А вот это `!authorized`, это отрицание от лямбды, оно всегда будет ложью. Это не отрицание результата выполнения лямбды, это отрицание для самого объекта лямбды.

    2.3.1 :001 > ->() { false }
     => #<Proc:0x00000001f744e0@(irb):1 (lambda)>
    2.3.1 :002 > !(->() { false })
     => false
    Ответ написан
    2 комментария
  • Как решить конфликт при пулл реквесте?

    Вам нужно сделать одно из двух
    1) провести ребейз вашей ветки на ту ветку, куда делаете пул реквест
    2) провести мерж в вашу ветку той ветки, куда делаете пул реквест

    Первый вариант предпочтительнее второго, т.к. не создаёт лишнего мусора в коммитах.
    Ответ написан
    1 комментарий
  • Как вывести только уникальные записи последней связи?

    Если вопрос о том, как сделать uniq для коллекции, то
    Model1.includes(:model2).map { |item| item.model2.name }.uniq.each { ... }

    или
    Model1.includes(:model2).uniq { |item| item.model2.name }.each { ... }


    Если же о том, как вообще сделать выборку, то лучше использовать вариант от fairoj выше
    Ответ написан
    Комментировать
  • Стоит переезжать на neovim?

    Вам стоит самостоятельно попробовать его и решить, подходит вам или нет. Некоторые vim плагины не работают, или работают неправильно в neovim.
    Когда я его пробовал где-то с год назад, что-то мне не понравилось, не стал им пользоваться.
    Полгода назад туда, где я работаю, пришёл новый сотрудник, он пользовался neovim. Пару дней поработав, у него что-то пошло не так, и он мигрировал на macvim :)
    Ответ написан
  • Как сделать URL с датой, как на Meduza?

    За формирование урла отвечает метод to_param в ActiveRecord модели.
    Для примера из meduza метод to_param выглядел бы примерно следующим образом

    class Article < ...
      # ...
      def to_param
        "#{created_at.year}/#{created_at.month}/#{created_at.day}/#{transliterated_title}"
      end
      # ..
    end


    Но одного этого недостаточно, чтобы всё начало работать. В контроллере теперь нужен какой-то механизм, который сможет по строке "2016/10/11/sgorevshiy-flagman-perezhivet-li-samsung-proval-s-galaxy-note-7".

    И тут есть два варианта.

    1. В первом варианте в методе to_param добавляется id к строке вот так
    def to_param
      "#{created_at.year}/#{created_at.month}/#{created_at.day}/#{id}-#{transliterated_title}"
    end

    или вот так
    def to_param
      "#{created_at.year}/#{created_at.month}/#{created_at.day}/#{transliterated_title}-#{id}"
    end


    В таком случае в контроллере извлекаем из строки id и ищем по нему модель в базе.

    2. Во втором варианте в модель добавляется поле, которое обычно называют либо permalink, либо slug. И в модели в before_save колбеке заполнятся это поле.
    before_save :update_slug
    
    private
    
    def update_slug
      self.slug = to_param
    end


    После чего в контроллере можно искать модель по строке.

    Лично я предпочитаю первый способ, т.к. он проще, особенно, если id размещать в самом начале строки вот так
    def to_param
      "#{id}-#{transliterated_title}"
    end

    Тут поиск модели превращается в обычный find.
    @resource = Article.find params[:id].to_i

    Для автоматизации второго способа есть гемы permalink и friendly_id.
    Ответ написан
    Комментировать
  • GIT: как скопировать (не слить!) ветку c форка в оригинальный реп?

    # подключаете удалённый репозиторий к своему
    git remote add baz https://github.com/baz/bar.git
    git fetch baz
    
    # переключаетесь на нужную ветку
    git checkout baz/fuz
    # и дальше ответвляетесь от неё
    git checkout -b new_branch_name
    Ответ написан
  • RSpec Rails - почему в features проверяются не все тесты?

    Проходят оба expect. В feature тестах scenario является синонимом it из обычных тестов.
    Если rspec выдал в логи, что тест прошёл, значит выполнилось всё, что в нём написано.
    Чтобы убедиться в этом, попробуйте выполнить следующий код

    scenario "root page" do
      visit root_path
    
      puts 'A'
      expect(page).to have_link("Login", href: login_path(locale: I18n.locale))
      puts 'B'
      expect(page).to have_link("Signup", href: signup_path(locale: I18n.locale))
      puts 'C'
    end
    Ответ написан
    4 комментария
  • Чем отличаются данные конструкции?

    Отличия есть. В первом случае код внутри класса будет видеть константы из модуля (и имена вложенных классов соответственно), а втором - нет.
    Пример:
    module A1
      TEST = 'zz'
    end
    
    module A1
      class B1
        def foo
          TEST
        end
      end
    end
    
    module A2
      TEST = 'zz'
    end
    
    class A2::B2
      def foo
        TEST
      end
    end


    A1::B1.new.foo #> "zz"
    A2::B2.new.foo #> NameError: uninitialized constant A2::B2::TEST
    Ответ написан
    1 комментарий
  • Как изменить надпись ошибки NGINX 429 Too Many Requests?

    В секцию server конфига nginx добавьте
    error_page 429 /429.html;
    и поместите файл 429.html туда, куда указывает root у server

    Вот кусочек конфига как пример

    server {
      listen 80;
      server_name zzzz.org;
      root /home/apps/zzzz/production/current/public;
    
      error_page 502 /502.html;
    
      # ...
    }
    Ответ написан
    Комментировать
  • Как протестировать вызов маилера?

    let(:confirm_oauth) { double deliver_now: nil }
    before do
      allow(ConfirmOauth).to receive(:email_confirmation)
        .and_return confirm_oauth
    end
    subject! { do_something_that_calls_mailer }
    
    it do
      expect(ConfirmOauth).to have_received(:email_confirmation).with user
      expect(confirm_oauth).to have_received :deliver_now
    end


    Другой способ - это метод receive_message_chain https://relishapp.com/rspec/rspec-mocks/docs/worki... Он подойдёт, если не нужно проверять с какими параметрами были вызваны промежуточные методы.
    Ответ написан
    Комментировать
  • Как правильно разделить доступ к views для разных ролей на Rails 4?

    Вам нужен метод prepend_view_path, в котором в зависимости от роли выставляйте нужный путь.
    apidock.com/rails/AbstractController/ViewPaths/Cla...

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

    class Manage::SomeController < ...
      layout 'manage_application'
    end


    Admin::SomeController

    Director::SomeController
    Ответ написан
    1 комментарий
  • Где найти хороший туториал по регулярным выражениям в руби?

    Ответ не совсем на ваш вопрос, но...
    Почитайте лучше книгу "Регулярные выражения" от Джеффри Фридла www.ozon.ru/context/detail/id/4066500
    Написана она интересно и очень доступным языком. После прочтения и осознания этой книги никакие туториалы вам уже не понадобятся, как и не будет для вас разницы, на каком языке использовать регулярные выражения: на руби, яваскрипте, пхп или c#.
    Ответ написан
    Комментировать
  • Какую мышу взять для макбука?

    Лучше поднакопить денег и взять таки magic mouse. В OSX повсюду интегрирована поддержка жестов, и купив любую другую мышь вы сильно потеряете в юзабилити, т.к. апловская мышь хороша как раз тем, что поддерживает эти самые жесты.

    Другим ответившим: мышь нужна, если к ноутбуку подключаешь монитор, чтобы использовать ноубук как "декстоп". В таком случае нужна и мышь, и клавиатура. Это очень удобно как минимум при программировании.
    Ответ написан
    3 комментария
  • Как в Rails ловить ActionController::RoutingError при отдаче изображений на девелопменте?

    Из рельс в общем-то никак, т.к. изображения на продакшене должны отдаваться nginx'ом. У рельс есть настройка для продакшена, насильно отключающая отдачу статики
    # Disable Rails's static asset server (Apache or nginx will already do this)
    config.serve_static_files = false

    Если вы всё же по каким-то соображениям отдаёте статику рельсами, что категорически неверно, то в ApplicationController можно сделать перехватчик эксепшена
    rescue_from ActionController::RoutingError, with: :routing_error

    и в нём проверять, урл картинки это или нет.
    Ответ написан
    4 комментария
  • Как вести разные проекты с одним базовым функционналом?

    С ветками намучаетесь. Выносите базовый фукционал в git submodule https://git-scm.com/book/ru/v1/%D0%98%D0%BD%D1%81%...
    Гит с ними немного кривовато работает, будет не так удобно, как с одним репозиторием, но жить можно.

    Либо же, если ваш язык/фреймворк поддерживает вынесение кода в легко и удобно подключаемые модули, то выносите движок в модуль и в отдельный репозиторий.
    Ответ написан
    2 комментария
  • Как отчлючить token authenticity?

    В контроллере:
    skip_before_action :verify_authenticity_token
    Ответ написан
    Комментировать
  • Как правильно составить запрос?

    либо фильтровать сразу в запросе

    Post
      .where.not(id: @posts_hot.map(&:id))
      .where.not(id: Post.where(post_block_id: 2)) # magic number anipattern. лучше заменить на константу
      .where.not(id: Post.joins(:post_asset).where.not(post_asset: { quote: nil }))
      .order(created_at: :desc)
      .limit(15)


    либо отфильтровать после запроса в коде

    Post
      .includes(:post_asset)
      .where.not(id: @posts_hot.map(&:id))
      .order(created_at: :desc)
      .limit(15)
      .select { |post| post.post_block_id != 2 }
      .select { |post| post.post_asset.try :quote }
    Ответ написан
    7 комментариев