gpt4 book ai didi

ruby-on-rails - rails :Best way to update multiple models when changes are made to another model

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:08 25 4
gpt4 key购买 nike

我正在构建一个模型为 AutomaticMatch 的 Rails 4.2 应用程序存储 Account 之间的匹配分数(用户个人资料)和 Assignment . Account之间存在has_many关系和 AutomaticMatch , Assignments 相同.我在帮助程序中存储了多种方法来计算该分数:

#Calculates the total compatibility score between an account and an assignment
#Returns a decimal which is the percent of compatibility

def total_score_assign(account,assign)
score_categories = score_categories_assign(account,assign)
sum = 0
categories = (assign.skills.map{|h| h.category}).uniq

score_categories.each do |k,v|
sum += v
end

total = sum / categories.size
end

所以,我想触发分数的计算并创建相应的AutomaticMatch Assignment 之前的数据库记录保存并重新计算+更新AutomaticMatch每当 Assignment 时记录或 Account已更新。我的问题是,鉴于我应该在另一个模型发生变化时对不同模型执行 CRUD 操作这一事实,实现这个的最佳方法是什么? 经过一番研究,我发现了以下方法:

  • 应用策略模式并创建一个服务类,我在其中执行这些操作
  • 使用 ActiveRecord 回调并在 AutomaticMatch 模型中执行这些操作
  • 使用观察者

现在我很困惑,因为我不知道是否有 Rails 方法可以做到这一点,如果有的话,是上面哪一个。这是我在 Rails 中的第一个大项目,我对大型应用程序特有的问题和实践还不太了解,所以我非常感谢有见地的意见。

最佳答案

一个非常酷的项目提供发布/订阅并允许服务类响应来自各种应用程序事件的消息是 wisper:https://github.com/krisleech/wisper - 您可以注册监听器并使用服务对象响应通知。我发现它是一种非常有用的方法,可以避免依赖关系并使代码更有条理。将作业推送到后台进程以避免阻塞等也很容易。以下是一篇文章的修改摘录,可在此处找到:http://www.toptal.com/ruby-on-rails/the-publish-subscribe-pattern-on-rails

# app/listener/feed_listener.rb
class FeedListener
def post_create(post)
Services::FeedService.create!(post)
end
end

# app/controllers/api/v1/posts_controller.rb
# corresponds to the publisher in the previous figure
class Api::V1::PostsController < Api::V1::ApiController
def create
@post = current_user.posts.build(post_params)
if @post.save
# Publish event about post creation for any interested listeners
publish(:post_create, @post)
render_created(@post)
end
end
end

# config/initializers/wisper.rb
Wisper.subscribe(FeedListener.new)

这是我发现的保持关注点分离、划分服务代码并防止我的模型和 Controller 变得过于臃肿的最佳方式。

关于ruby-on-rails - rails :Best way to update multiple models when changes are made to another model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30363152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com