【问题标题】:combining user owned objects in rails在 Rails 中组合用户拥有的对象
【发布时间】:2017-08-09 15:08:22
【问题描述】:

我有一个关于 Rails 4.1 的问答论坛,带有一个反应客户端,用户可以在其中创建问题、答案和 cmets。我想使用活动模型序列化程序传递所有用户活动(无论类型如何)。理想情况下,这应该是一个按 created_at 排序的对象数组。我能够创建数组,但推送方法会相互覆盖。

我觉得我可能需要实际使用哈希来避免使用嵌套在单个对象数组中的属性的迷宫,但希望得到一些指导。

如果这没有意义,请考虑 Facebook 向您显示您最近的活动:

[
  "You posted 'It's my birthday!' on 08/04/2017", 
  "You liked Tammy's post on 8/3/2017", 
  "You commented on Rihanna Tweets as Motivational Posters page on 8/1/2017"
]

user_activity 方法:

def user_activity
  activity = []

  self.object.questions.each do |question|
    activity.push(question)
  end

  self.object.answers.each do |answer|
    activity.push(answer)
  end

  self.object.comments.each do |comment|
    activity.push(comment)
  end

end

感谢和抱歉这个菜鸟问题。

【问题讨论】:

  • 你的 user_activity 必须在最后返回 activity 数组——另外,我认为在你的情况下使用 AM::Serializer 是多余的,因为你只想输出一个字符串(而不是序列化记录到特定对象中,例如哈希)。每个需要此用户活动兼容(= 字符串)输出的模型中包含的简单模块就足够了。我可以举例说明如何实现这一目标
  • 哇!谢谢@MrYoshiji。我知道这是我忘记的愚蠢的事情。按预期工作!谢谢!
  • 我认为我们现在已经与 AMS 结婚了,但我不介意额外的信息。我们实际上是在序列化非用户对象中的很多记录。

标签: ruby-on-rails active-model-serializers


【解决方案1】:

模块实现:

module UserActivityOutputer
  def output_for_user_activity
    raise NotImplementedError, "You must implement `#{self.class}##{__method__}`"
  end
end

模块包含:

class Post
  include UserActivityOutputer
  def title ; 'combining user owned objects in rails' ; end # only here for easy copy-paste test in IRB
  def created_at ; DateTime.now ; end # only here for easy copy-paste test in IRB

  def output_for_user_activity
    "You posted '#{self.title}' on #{I18n.l(self.created_at.to_date)}"
  end
end

class SomeModel
  include UserActivityOutputer
  # did not implement output_for_user_activity method for example purpose
end

用法:

Post.new.output_for_user_activity
# => "You posted 'combining user owned objects in rails' on 2017-08-09"
SomeModel.new.output_for_user_activity
# => NotImplementedError: You must implement `SomeModel#output_for_user_activity`

您可以将此处显示的所有代码复制粘贴到新打开的 IRB 控制台中(可能重新定义现有的 PostSomeModel 类)并查看输出。

这是一个非常基本的实现,仅用于定义“这条记录应该输出什么”。它不支持排序,这将在其他地方进行。

【讨论】:

  • 确实如此。只是好奇为什么你更喜欢这个而不是使用 AMS。我们通过序列化程序传递其他所有内容,并且仅在客户端中使用此“活动列表”。它不会作为用户模型或类似内容的单独列保留。
猜你喜欢
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多