Создайте метод для агрегирования данных вместо обновления - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть следующие модели:

class Post < ApplicationRecord
  belongs_to :site

  has_one :metric, dependent: :destroy
end

class Metric < ApplicationRecord
  belongs_to :post
end

И я хотел бы создать конечную точку, которая при вызове агрегирует отправленные данные, а не просто обновляет их. Итак, в моих маршрутах я изменил обычный put "metrics", to: "metrics#update на patch "metrics", to: "metrics#update, и мой контроллер выглядит следующим образом:

class MetricsController < ApplicationController
  before_action :set_post, only: [:update]

  def update
    # TODO
  end

  private

  def set_post
    @post = Post.find_by(post_id: params[:post_id])
  end
end

Первое, что следует отметить, это то, что вместо обычного METHOD /{id} все маршрутыследует называть передачей post_id. Хотя это может показаться странным, но в моем случае это имеет смысл - WordPress-блоги по всему миру (надеюсь, ха-ха) будут отправлять метрики в эту конечную точку, и единственное, что они знают, - это их уникальный идентификатор (site_id) +идентификатор сообщения в блоге WordPress (тот, который хранится в базе данных WordPress - я называю его post_id в моей базе данных).

Для примера скажем, что моя модель имеет только следующие столбцы:

sentiment
word_count
paragraph_length

Теперь, я хотел бы получить вашу помощь в следующем: как я могу проверить, если эти свойства присутствуют в теле запроса?

Спасибо

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Ответ Пресата должен быть в порядке. Также хорошо иметь проверку на уровне модели. Например:

class Metric < ApplicationRecord
  belongs_to :post
  validates_presence_of :sentiment, message: "can't be blank"
  validates_presence_of :word_count, message: "can't be blank"
  validates_presence_of :paragraph_length, message: "can't be blank"
end
1 голос
/ 06 ноября 2019

Вы можете добавить следующий закрытый метод и вызвать его перед обновлением, чтобы проверить наличие параметров

def is_params_present?
  ["sentiment","word_count","paragraph_length"].all? {|k| params.has?(k) && params[k].present?}
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...