我正在开展一个学校项目,我是ROR的新手。我有两个对象,收据和主题。收据有一个主题,主题在收据中重复使用。如果我的收据数量相同,我没有问题,但是当我没有为收据创建新主题时,我收到此错误:Screenshot of Error
这里的问题是我在数据库中只有两个主题,有3个收据。所以主题的id为3无效。我的模型,视图,控制器和迁移都在跟随。
class Receipt < ActiveRecord::Base
belongs_to :user
has_one :subject, :foreign_key => :id
validates :user_id, presence:true
validates :descript, presence: true, length: { minimum: 4, maximum: 120 }
end
class Subject < ActiveRecord::Base
has_many :receipts
validates :subject_name, presence: true, length: { minimum: 2, maximum: 30 }
validates :description, presence: true, length: { minimum: 2, maximum: 200 }
end
The View:
<% @receipts.each do |receipt| %>
<tbody>
<tr>
<td><%= receipt.date %></td>
<td><%= receipt.subject.subject_name %></td>
</tr>
</tbody>
<% end %>
class ReceiptsController < ApplicationController
def index
@receipts = Receipt.paginate(page: params[:page], per_page: 4).order("updated_at DESC")
end
end
class CreateReceipts < ActiveRecord::Migration
def change
create_table :receipts do |t|
t.datetime :date
t.decimal :tax_amount, :purchase_amount, precision: 5, scale: 2
t.boolean :approved, default: false
t.text :descript
t.integer :user_id, :subject_id
t.timestamps
end
end
end
class CreateSubjects < ActiveRecord::Migration
def change
create_table :subjects do |t|
t.string :subject_name
t.text :description
t.timestamps
end
end
end
我认为我的迁移和观点很好,因为当我有相同的收据时,它可以正常工作,但是非常感谢此时的任何反馈。提前谢谢!
答案 0 :(得分:0)
问题是你的关联。 has_one
关联尝试查看关联表,在这种情况下为Subject
,foreign_key
的记录等于具有关联{{1}的对象的id
在这种情况下3。
您可以摆脱Receipt
,而是使用像
has_one :subject
或者您可以将关联更改为def subject
Subject.find_by_id subject_id
end
。
您不应该在关联的两边都有belongs_to :subject
或has_one
。由于has_many
中有has_many
,因此您应Subject
使用belongs_to
。
希望有所帮助。