Ruby rand()不能接受变量?

Elx*_*lxx 5 ruby ruby-on-rails

我对此感到有点困惑.

我在RoR项目中的最终目标是从我的数据库中获取单个随机配置文件.

我在想它会是这样的:

@profile = Profile.find_by_user_id(rand(User.count))
Run Code Online (Sandbox Code Playgroud)

它不停地抛出错误,因为user_id0不存在,所以我把它的一部分拉出来只是为了看看发生了什么:

@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()不能采用静态整数以外的输入.

我对吗?这是怎么回事?

the*_*Man 9

尝试:

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中有两条记录,则查找失败可能导致异常.