我有这样的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方式?
提前致谢!
答案 0 :(得分:0)
我发现在这里效果最好的模式是有一个datetime
类型字段,用于记录记录被标记的时间。
例如:
def confirm!
self.confirmed_at = DateTime.now
self.save!
end
然后你可以告诉什么时候确认了什么。当您遇到 标记但尚未标记的情况时(例如将来设置发布日期),这会非常方便。
虽然没有你的STI手提包可能看起来有点烦人,但STI并不总是合适的工具。通常,STI用于区分具有许多共性或在共同环境中使用的相似但不同的模型。它不应该被用来处理单一模型的不同状态。
在这种情况下,您想要的是状态机类型模式。