RoR MongoDB Arrayfield用法

时间:2012-08-24 14:54:59

标签: ruby-on-rails arrays mongodb

我是MongoDB的新手,并且不确定如何使用Array-Field-Type。

所以我在我的模型中创建了

field :admins, type: Array

在此字段中,我想存储所有属于模型“管理员”的user_ids。但是当我尝试设置这个字段时,它不会保存数组中的信息,它只是简单地创建一个带有ID的字符串。由于我的限制,只有管理员可以编辑我的过滤功能

def check_if_admin
  unless Agency.find(params[:id]).admins.include?(current_agent.id)
    flash[:notice] = "Only possible as Admin."
    redirect_to root_path
  end
end

得到错误

"can't convert Moped::BSON::ObjectId into String"

所以我尝试在create def中使用ID:

启动我的字段
@agency.admins = [current_agent.id]

这对数组中的一个用户执行了操作,但如何在此字段中添加ID?

当我进入编辑表格时:

<%= form_for(@agency) do |f| %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :admins %><br />
    <%= f.text_field :admins %>  <br />
  </div>          
  <div class="field">
    <%= f.label :agents %><br />
    <%= f.text_field :agents %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

然后手动输入另一个User_ID,我又回到了我的错误。 任何人都知道怎么解决这个问题?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

此消息表示在某些时候您存储了一个应该有ObjectId的字符串。 Ruby试图将current_agent.id(一个ObjectId)与params [:id](一个字符串)进行比较。

在将输入推送到数组之前,您似乎没有将输入从表单中的text_field转换为ObjectID。

从admins字段中获取输入,并使ObjectId像这样:

BSON::ObjectId.new(string_representing_admin_id)

我猜管理员字段是逗号分隔的admin _ids数组,并且您正在使用一些易于使用的_id值,例如用户名而不是生成的ObjectId,因为这会非常繁琐与之合作。

在这种情况下,你可能会拆分并剥离输入,然后使用map / select创建一个ObjectIds数组。

使用在rails中显示用户名的选择字段会更容易吗?

无论如何,如果您需要更多帮助,请展示集合中的一些示例文档。