我对此有点困惑。
我在 RoR 项目中的最终目标是从我的数据库中获取单个随机配置文件。
我想它应该是这样的:
@profile = Profile.find_by_user_id(rand(User.count))
它一直抛出错误,因为 user_id
0 不存在,所以我把它的一部分拿出来检查发生了什么:
@r = rand(User.count)
<%= @r %>
每次都返回 0。发生什么了?我注册了 5 个假用户和 5 个相关配置文件来测试这个。
如果我将 Profile.find_by_user_id(rand(User.count))
重写为
Profile.find_by_user_id(3)
它工作得很好。
User.count
也在工作。所以我认为 rand()
不能接受除静态整数以外的输入。
我说的对吗?怎么回事?
最佳答案
尝试:
Profile.first(:offset => rand(Profile.count))
随着数据库的老化,尤其是带有用户记录的数据库,您的 ID 字段序列将出现空白。尝试随机获取 ID 可能会失败,因为您可能会尝试随机获取已删除的 ID。
相反,如果您计算记录的数量,然后随机转到表中的某个偏移量,您将避免丢失 ID 的可能性,并且只会登陆现有记录。
除非非常仔细地观察数据库的完整性,否则来自 OP 问题的以下示例可能会遇到一些问题:
profile = Profile.find_by_user_id(rand(User.count))
问题是,User 表有可能与 Profile 表不同步,从而导致它们拥有不同数量的记录。例如,如果 User.count
为 3 并且 Profile 中有两条记录,则查找失败可能会导致异常。
关于ruby-on-rails - Ruby rand() 不能接受变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4331724/