我有一个支持电子邮件订阅,调查和评论表单的应用程序。我有一个模型(分别是Subscription,SurveyResponse和Comment)。我还有一个访客模型来存储共享信息,如姓名,电子邮件,电话等。
我想知道如何最好地将模型结合在一起。使用每个模型与访客模型之间的一对一关联将分别处理每个事件。因此,如果John Doe提交了评论和调查,他将在访问者表中获得两条记录。我倾向于这种方法 - 它更简单。
另一方面,我可以在访问者上设置一对多关联,并对电子邮件设置唯一约束。然后,我可以尝试将每个事件绑定到已存在的记录,例如:
@visitor = Visitor.find_by_email(params[:email]) || Visitor.new(params)
这种方法似乎有问题,因为我无法确定我是否能获得正确的记录。如果两个不同的人使用“spam@example.com”提交评论怎么办?不太可能,但可能
有没有更好的方法来解决这个问题?
一些澄清:
我不打算为常规网站访问者提供完整的用户帐户。
验证非常少(新订阅会验证是否传递了电子邮件,评论需要在评论字段中显示文字,但大多数字段都是可选的)
答案 0 :(得分:1)
如果您从未计划拥有完整的用户系统或验证电子邮件地址,那么您最好使用一对一关联。它基本上与将访问者模型的字段硬编码到每个其他表中相同,但减少了重复。如果您不在乎同一个电子邮件地址可能在您的网站上有不同的名称,电话号码等,那么请坚持使用。
如果您希望姓名,电话号码等始终是最新使用的,那么当他们提交内容时,请在访问者表格上进行更新。
为方便起见,您可以使用Cookie预先填写表单字段,但这并不妨碍某人在另一台计算机或浏览器上输入有冲突的信息。
答案 1 :(得分:0)
我的建议是在客户端存储一个具有随机/唯一ID的持久性cookie,并使用它来跟踪用户。
如果用户是已知用户(已登录),则可以将该ID以多对一关系链接到userId(因为用户可能从不同的计算机登录)。