创建一种汇总数据而不是更新数据的方法

时间:2019-11-05 23:20:57

标签: ruby-on-rails ruby

我有以下型号:

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博客(希望是哈哈)都会向该端点发送指标,而他们唯一知道的就是唯一的ID(site_id )和wordpress博客帖子ID(存储在wordpress数据库中的ID)(我在数据库中称其为post_id)。

为示例起见,假设我的模型只有以下列:

sentiment
word_count
paragraph_length

现在,我希望您提供以下帮助:如果请求正文中存在这些属性,如何确认?

谢谢

2 个答案:

答案 0 :(得分:1)

您可以添加以下私有方法并在更新之前调用它,以检查是否存在参数

def is_params_present?
  ["sentiment","word_count","paragraph_length"].all? {|k| params.has?(k) && params[k].present?}
end

答案 1 :(得分:1)

Presath的回答应该很好。也具有模型级验证也很好。例如:

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