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