我有一个Contract和一个Task_Order模型。我不断获得unknown attribute error for contract_id
每个Contract has many Task Orders
。我已经阅读了其他嵌套模型未知属性错误问题,但他们还没有能够帮助我。请记住,我是Rails的新手,非常感谢我能得到的任何帮助。我正在使用 Rails 4.0
合同模型:
has_many :task_orders
合约架构:
create_table "contracts", force: true do |t|
t.string "contractId"
t.string "contractName"
end
任务订单模型:
belongs_to :contracts
任务订单架构:
create_table "task_orders", force: true do |t|
t.string "contract_Id"
t.string "task_orderId"
t.string "task_orderName"
end
当我点击Show Contract
时,我收到错误:
unknown attribute: contract_id
这是突出显示的行:
<%= form_for([@contract, @contract.task_orders.new]) do |f| %>
我可以说Rails正在尝试打印contract_id
,这不在我的Contract
模型中......所以如何让它打印出来contractId
代替在我的Contract
模型中?
谢谢!
答案 0 :(得分:2)
任务订单模型应具有此行belongs_to contract
belongs_to关联应声明为相应模型的单数
task_orders 表中也应该有 contract_id 列。
下图解释了Rails中belongs_to的默认行为
答案 1 :(得分:1)
你需要注意的是Rails的foreign_key
(以及一般的关系数据库):
外键
滑轨&#39;标准foreign_key
是使用snake_case
(contract_id
),但是,您可以使用非常规foreign_keys
,如下所示:
#app/models/order.rb
belongs_to :contract, foreign_key: "contract_Id"
#schema SHOULD be:
create_table "orders", force: true do |t|
t.integer "contract_id" #-> should
t.string "contract_Id" #-> your current
end
主键
create_table "contracts", force: true do |t|
t.string "contractId" #-> don't need
t.string "contractName" #-> your current
t.string "name" #-> should be
end
您的primary_key
几乎总是id
列。您应该从contractId
db!
contracts
列
您需要这样做:
#app/models/order.rb
belongs_to :contracts
has_many :task_orders
然后您需要app/models/task_order.rb
<强>表格强>
您的表单显示错误。这是因为您尝试在视图中创建ActiveRecord。使用标准accepts_nested_attributes_for
方法通过表单传递嵌套模型数据会更好:
#app/models/contract.rb
def new
@contract = Contract.new
@contract.task_orders.build
end
#app/views/contracts/new.html.erb
<%= form_for @contract do |f| %>
答案 2 :(得分:0)
首先,对singular names
belongs_to
Class TaskOrder < ActiveRecord::Base
belongs_to :contract
end
其次,请尝试将contract_Id
表格中的task_orders
更改为contract_id
。
Rails会查找model_name_id(in your case contract_id)
foreign key
,除非您的模型中定义了custom foreign keys
。
最后,为data type integer
指定default foreign key
。在您的情况下,应为t.integer contract_id
但是,如果您希望contract_Id
为foreign key
,则应在custom foreign key
模型本身中将其定义为Contract
Class Contract < ActiveRecord:Base
has_many :task_orders,:foreign_key => "contract_Id"
end