Elx*_*lxx 5 ruby ruby-on-rails
我对此感到有点困惑.
我在RoR项目中的最终目标是从我的数据库中获取单个随机配置文件.
我在想它会是这样的:
@profile = Profile.find_by_user_id(rand(User.count))
Run Code Online (Sandbox Code Playgroud)
它不停地抛出错误,因为user_id
0不存在,所以我把它的一部分拉出来只是为了看看发生了什么:
@r = rand(User.count)
<%= @r %>
Run Code Online (Sandbox Code Playgroud)
每次返回0.发生什么了?我注册了5个假用户和5个相关的配置文件来测试它.
如果我把Profile.find_by_user_id(rand(User.count))
它重写为
Profile.find_by_user_id(3)
Run Code Online (Sandbox Code Playgroud)
它工作得很好.
User.count
也在努力.所以我认为rand()
不能采用静态整数以外的输入.
我对吗?这是怎么回事?
尝试:
Profile.first(:offset => rand(Profile.count))
Run Code Online (Sandbox Code Playgroud)
随着数据库老化,尤其是具有用户记录的数据库,您的ID字段序列中将存在间隙.尝试随机获取ID可能会失败,因为您可能会尝试随机抓取已删除的ID.
相反,如果你计算记录的数量,然后随机转到表中的一些偏移量,你将回避丢失ID的可能性,并且只能登陆现有记录.
除非仔细观察数据库的完整性,否则OPs问题中的以下示例可能会遇到一些问题:
profile = Profile.find_by_user_id(rand(User.count))
Run Code Online (Sandbox Code Playgroud)
问题是,User表可能与Profile表不同步,允许它们具有不同数量的记录.例如,如果User.count
为3并且Profile中有两条记录,则查找失败可能导致异常.
归档时间: |
|
查看次数: |
859 次 |
最近记录: |