如何在Rails中向模型中添加非持久性数据?

时间:2013-12-18 00:45:10

标签: ruby-on-rails design-patterns

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

模型/ quiz.rb:

class Quiz
  attr_accessor :user_voted # a boolean
end

quiz = Quiz.new
quiz.user_voted = ComplicateLogic.get_user_voted(current_user, quiz)

我想在前端更容易并设置字段,以便前端可以轻松使用'quiz.user_voted',但我觉得在测验模型中添加:user_voted非常脏,如它在模型上设置属性值,不一定属于那里。

2 个答案:

答案 0 :(得分:1)

您可以使用active decorator。或者any decorator gem你想要的。

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

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

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

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

然后在您的观看中,您将获得访问权限:

@quiz.user_voted

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

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

答案 1 :(得分:1)

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

我对表格使用了这个范例。您可以使用具有此类属性的form_for,并在允许大量分配属性时自动设置它。这样它的功能就像任何其他属性一样,但不需要保存。