Ruby on rails 4 有一个关系集合选择未定义的方法“部门id';对于

Ruby on rails 4 有一个关系集合选择未定义的方法“部门id';对于,ruby-on-rails-4,mongoid,Ruby On Rails 4,Mongoid,我有一个模型模式: class Order include Mongoid::Document has_one :department end class Department include Mongoid::Document belongs_to :order end 订单如下所示: <%= form_for @order, :html => {} do |f| %> <%= f.collection_select(:department_id,

我有一个模型模式:

class Order
  include Mongoid::Document
  has_one :department
end
class Department
  include Mongoid::Document
  belongs_to :order
end
订单如下所示:

<%= form_for @order, :html => {} do |f| %>
  <%= f.collection_select(:department_id, Department.all, :id,:name) %>
  <%= f.submit nil %>
<% end %> 
{}do | f |%>
Submit会抛出此错误消息:

undefined method `department_id' for #<Order:0x007f993861e0f8>
未定义的方法“部门id”#

我真的不知道为什么。有什么想法吗?谢谢

您应该更改模型定义。
属于_to
定义要求模型中有相应的id值。
有一个
没有,因为它依赖于对应项

因此,您应该设置模型,将
有一个
属于
调用倒置:

class Order
  include Mongoid::Document
  belongs_to :department
end
class Department
  include Mongoid::Document
  has_one :order
end
我还担心
部门
应该关联多个订单。在这种情况下,您可以简单地删除
has_one:order
语句

现在,要使一切正常运行,您必须确保
订单
模型中存在
部门id
字段。我不知道Mongoid的世界,但是对于一个普通的数据库,你会这样做

rails g migration AddDepartmentIdToOrders department_id:integer
rake db:migrate

那么,您应该没事了。

问题是,您正朝着与关系存储相反的方向前进。 从订单到部门的关系的存储实际上已存储 作为部门上的外键订单id,而不是订单上的部门id。 设置关系后,可以通过检查模型的对象来验证这一点。 如果要使用collection_select,则需要转到另一个方向以使用外键。 下面的示例显示了如何从父级到子级前进。 希望它能帮助你进步

app/controllers/demo_controller.rb

class DemoController < ApplicationController
  def show
    @order = Order.first
    render :show
  end
end
class DemoController
app/views/demo/show.html.erb

<h1>Demo#show</h1>
<p>Find me in app/views/demo/show.html.erb</p>

<%= form_for @order, url: {action: "show"}, :html => {} do |order_form| %>
    <%= order_form.text_field :date %>
    <%= fields_for @order.department do |order_department_form| %>
        <%= order_department_form.text_field :name %>
    <% end %>
    <%= order_form.submit nil %>
<% end %>
Demo#show
在app/views/demo/show.html.erb中查找我

<h1>Demo#show</h1>
<p>Find me in app/views/demo/show.html.erb</p>

<%= form_for @order, url: {action: "show"}, :html => {} do |order_form| %>
    <%= order_form.text_field :date %>
    <%= fields_for @order.department do |order_department_form| %>
        <%= order_department_form.text_field :name %>
    <% end %>
    <%= order_form.submit nil %>
<% end %>
{}do| order|u form |%>
测试/功能/演示控制器测试.rb

require 'test_helper'

class DemoControllerTest < ActionController::TestCase
  def setup
    Order.delete_all
    Department.delete_all
    puts
  end
  test "0. mongoid version" do
    puts "Mongoid::VERSION:#{Mongoid::VERSION}\nMoped::VERSION:#{Moped::VERSION}"
  end
  test "should get show" do
    order = Order.create(date: Time.now)
    department = Department.create(name: 'Development')
    order.department = department
    assert_equal 1, Order.count
    assert_equal 1, Department.count
    get :show
    assert_response :success
    #puts @response.body
  end
end
需要“测试助手”
类DemoControllerTest