【问题标题】:How to define association in a decorator?如何在装饰器中定义关联?
【发布时间】:2018-08-22 16:57:22
【问题描述】:

我不想用复杂的关联来污染我的模型(在 AR 模型中只有必要的验证和简单的关联)

class Post < ActiveRecord::Base
  has_many :visible_comments,
    -> {
      where(deleted_at: nil).joins(:user).where(users: { active: true }) 
    }, class_name: 'Comment'
end

我想将此关联移动到帖子的装饰器类中

PostsDecorator.new(posts).preload(:visible_comments)

有没有办法创建一个装饰器类,以便可以在其上声明关联(例如预加载关联)?

【问题讨论】:

  • 有什么办法可以做什么,究竟是什么?
  • @jvillian 添加装饰器,因此可以在其中定义关联
  • 我能想到的唯一方法是让你的装饰器成为ActiveRecord::Base 的子类——关联是在 AR 中为每个类定义的。我会说这是对设计模式的过度应用。

标签: ruby-on-rails associations decorator


【解决方案1】:

目前还不完全清楚您想要做什么。 “声明关联”(装饰器)很可能是 XY Problem

为什么不这样做:

class PostsDecorator < SimpleDelegator

  def visible_comments
    Comment.where(post: component, deleted_at: nil)
  end

private

  def component
    @component ||= self.__getobj__
  end

end

(或类似的东西。)

那么你就可以做到:

PostsDecorator.new(posts).visible_comments

关于“预加载”这个想法,嗯,我不知道该怎么做。

【讨论】:

  • 我更新了问题并试图更清楚地说明问题。现在我想要什么更清楚了吗?
  • 对我来说有点像刮牦牛毛。
猜你喜欢
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-17
相关资源
最近更新 更多