一对多关系搜索无效ID

时间:2015-11-21 22:41:43

标签: ruby-on-rails

我正在开展一个学校项目,我是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

我认为我的迁移和观点很好,因为当我有相同的收据时,它可以正常工作,但是非常感谢此时的任何反馈。提前谢谢!

1 个答案:

答案 0 :(得分:0)

问题是你的关联。 has_one关联尝试查看关联表,在这种情况下为Subjectforeign_key的记录等于具有关联{{1}的对象的id在这种情况下3。

您可以摆脱Receipt,而是使用像

这样的方法
has_one :subject

或者您可以将关联更改为def subject Subject.find_by_id subject_id end

您不应该在关联的两边都有belongs_to :subjecthas_one。由于has_many中有has_many,因此您应Subject使用belongs_to

希望有所帮助。