ruby-on-rails - Ruby rand() 不能接受变量?

标签 ruby-on-rails ruby

我对此有点困惑。

我在 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/

相关文章:

mysql - Ruby on Rails 中的读取锁定

ruby-on-rails - 在 lhm(大型强子迁移器)中添加默认列

ruby - 如何在 ruby 中产生延迟

ruby - 比 ruby 级少的是什么

ruby - 在 Ruby/Rails 中,如何对 URL 中的特殊字符进行编码/转义?

ruby-on-rails - 如何在 cookie rails 4 上存储数组?

ruby-on-rails - Inline_svg gem 不工作。找不到 SVG 文件

ruby-on-rails - 使用 mini-magick 和 carrierwave in rails 优化图像

ruby - 检查字符串是否只包含允许的字符

javascript - 什么是将事物分类为类型的良好 JavaScript 模式?