如何在模型方法中将STI类重新分配给变量?

时间:2014-10-02 21:06:55

标签: ruby-on-rails ruby sti

我有这样的STI:

class Post
end

class Post::Confirmed < Post
end

class Post::Draft < Post
  def confirm!
    becomes Post::Confirmed
  end
end

...# somewhere in controller
# POST /posts/1/confirm
# POST /posts/1/confirm.json
def confirm
  @post = Post::Draft.first
  @post = @post.confirm!    # this is the only way I can reload @post with Post::Confrmed 
end

以某种方式可以制作:

@post.confirm! # I want this @post(Post::Draft) to become Post::Confirmed without reassigning

还是只是RoR方式?

提前致谢!

1 个答案:

答案 0 :(得分:0)

我发现在这里效果最好的模式是有一个datetime类型字段,用于记录记录被标记的时间。

例如:

def confirm!
  self.confirmed_at = DateTime.now
  self.save!
end

然后你可以告诉什么时候确认了什么。当您遇到 标记但尚未标记的情况时(例如将来设置发布日期),这会非常方便。

虽然没有你的STI手提包可能看起来有点烦人,但STI并不总是合适的工具。通常,STI用于区分具有许多共性或在共同环境中使用的相似但不同的模型。它不应该被用来处理单一模型的不同状态。

在这种情况下,您想要的是状态机类型模式。