如何在Rails中将非持久性数据添加到模型中



目前我有一个测验,用户可以投票,我想在处理这些测验时在内存(而不是数据库)中设置一个字段,例如:

models/quiz.rb:

class Quiz
  attr_accessor :user_voted # a boolean
end
quiz = Quiz.new
quiz.user_voted = ComplicateLogic.get_user_voted(current_user, quiz)

我想让前端更容易,并设置字段,以便前端可以轻松使用"quizz.user_voted",但我觉得将:user_voted添加到测试模型中是非常肮脏的,因为它在模型上设置了一个属性值,而该值不一定属于该值。

您可以使用活动装饰器。或者任何你想要的装饰宝石。

我喜欢主动装饰器,因为它是自动的。

或者,您可以在控制器中定义对象后立即实现自己的混合方法。

无论如何,使用主动装饰器,您将拥有一个名为app/decorators/quiz_decorator.rb:的文件

module QuizDecorator
  def user_voted
    @user_voted ||= ComplicateLogic.get_user_voted(current_user, self) 
  end
end

然后在您的视图中,您将可以访问:

@quiz.user_voted

我会添加一个询问标记,因为方法返回布尔值:user_voted?

PS:我不知道你是否可以访问那里的current_user,不过你可以通过它。

模型本质上是一个链接到数据库的Ruby类。如果每个属性都不一定与数据库一致,那么它就不脏。添加额外的属性是一种非常干净的方法,因为它不需要添加额外的模型和/或宝石。

我经常在表格中使用这种范式。您可以将form_for与类似的属性一起使用,并在允许大量指定属性的情况下使其自动设置。这样,它的功能就像任何其他属性一样,但不需要保存。

最新更新