簡體   English   中英

RoR-SQLite3 :: SQLException:沒有這樣的列:-Rails不將_id附加到生成的查詢中

[英]RoR - SQLite3::SQLException: no such column: - Rails not appending _id to generated query

我有兩個模型對象LineItemClass和LineItemSubClass。 我試圖將新的LineItemSubClass添加到LineItemClass,並且它生成SQL錯誤:

SQLite3::SQLException: no such column: line_item_sub_classes.line_item_class.

正確的查詢應該更像line_item_sub_classes.line_item_class_id

我使用generate來創建所有內容,因此對於為什么會發生這種情況我很困惑。 在研究問題時,我在其他任何地方都看到過SQL消息,生成的查詢具有_id。 我唯一的想法是我對具有多個單詞名稱的資源做錯了-是否有關於多個單詞名稱的約定的好文檔?

schema.rb

ActiveRecord::Schema.define(:version => 20130905194234) do
  create_`enter code here`table "line_item_classes", :force => true do |t|
    t.string   "code"
    t.string   "name"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "line_item_sub_classes", :force => true do |t|
    t.string   "code"
    t.string   "name"
    t.integer  "line_item_class_id"
    t.datetime "created_at",         :null => false
    t.datetime "updated_at",         :null => false
  end

  add_index "line_item_sub_classes", ["line_item_class_id"], :name =>"index_line_item_sub_classes_on_line_item_class_id"
end

line_item_class.rb

class LineItemClass < ActiveRecord::Base 
  include ActiveModel::ForbiddenAttributesProtection

  has_many :line_item_sub_classes

  attr_accessible :code, :name

  validates :code, presence: true, length: {is: 2}, uniqueness: true
  validates :name, presence: true, length: {maximum: 100}, uniqueness: true
end

line_item_sub_class.rb

class LineItemSubClass < ActiveRecord::Base
  include ActiveModel::ForbiddenAttributesProtection

  belongs_to :line_item_class

  attr_accessible :code, :name

  validates :code, presence: true, length: {is: 2}, :uniqueness => {:scope => :line_item_class}
  validates :name, presence: true, length: {maximum: 100}, :uniqueness => {:scope => :line_item_class}
end

來自line_item_sub_classes_controller.rb的有害代碼

class LineItemSubClassesController < ApplicationController
  def create
    @line_item_class = LineItemClass.find(params[:line_item_class_id])
    @line_item_sub_class = 
      @line_item_class.line_item_sub_classes.
      create(params[:line_item_sub_class].permit(:code, :name))
    redirect_to line_item_class_path(@line_item_class)
  end
end

從視圖上看,這是表單部分-這是創建參數的原因嗎?

<%= form_for([@line_item_class,
              @line_item_class.line_item_sub_classes.build]) do |f| %>
  <p>
    <%= f.label :code %><br />
    <%= f.text_field :code %>
  </p>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.submit %>
  </p>
<% end %>

輸出html中的form標簽是

<form accept-charset="UTF-8" action="/line_item_classes/1/line_item_sub_classes" class="new_line_item_sub_class" id="new_line_item_sub_class" method="post">

該錯誤是由控制器在一行中生成的

@line_item_sub_class = @line_item_class.line_item_sub_classes.create(params[:line_item_sub_class].permit(:code, :name))

我嘗試將其分為兩行,但沒有幫助。 更新行拋出nil對象異常。

@line_item_sub_class =@line_item_class.line_item_sub_classes.new
@line_item_sub_class.update_attributes(params[:line_item_sub_class].permit(:code, :name))

完全錯誤是;

SQLite3::SQLException: no such column: line_item_sub_classes.line_item_class: SELECT 1 AS one FROM "line_item_sub_classes" WHERE ("line_item_sub_classes"."code" = 'A0' AND "line_item_sub_classes"."line_item_class" IS NULL) LIMIT 1. 

我不知道鐵匠在這里做什么,但我無法想象為什么會需要此查詢。 似乎只有在記錄存在后才能運行。

答案-排序問題...我通過更改LineItemSubClass模型中唯一性驗證器的范圍來修復錯誤。

  validates :code, presence: true, length: {is: 2}, :uniqueness => {:scope => :line_item_class}
  validates :name, presence: true, length: {maximum: 100}, :uniqueness => {:scope => :line_item_class}

就是現在

  validates :code, presence: true, length: {is: 2}, :uniqueness => {:scope => :line_item_class_id}
  validates :name, presence: true, length: {maximum: 100}, :uniqueness => {:scope => :line_item_class_id}

這可行。 現在,我可以創建一個嵌套的LineItemSubClass,而不會出現錯誤,但是我的RoR感覺有點刺痛。 當我將唯一性的范圍限定為現有關聯時,Rails似乎應該能夠推斷相關數據庫列的名稱。 對數據庫列的名稱進行編碼似乎很脆弱。 難道我做錯了什么?

因此,您的參數是:

{ "utf8"=>"✓", 
  "authenticity_token"=>"Lj8iy9VkzdWrvN4LyzXQ5BY7FdpV57l12Euqtch9RtQ=",
  "line_item_sub_class"=>{   // These are the only parameters that will get
    "code"=>"A0",            // considered when creating your new
    "name"=>"Panel Box"      // LineItemSubClass record in the DB
  }, 
  "commit"=>"Create Line item sub class",
  "action"=>"create",
  "controller"=>"line_item_sub_classes",
  "line_item_class_id"=>"1"  // But this parameter needs to be included
                             // needs to be included to set the
                             // line_item_sub_classes.line_item_class_id field
}

看起來,在您的控制器中,您正在使用params[:line_item_sub_class]創建新記錄。 所以,我認為首先您需要更改表格,以便...

params[:line_item_class_id]

...實際上在

params[:line_item_sub_class][:line_item_class_id]

那將帶您進入那里。 但是,我認為這不一定能解決您的整個問題。 您可以通過以下方式更新您的問題:

  1. 此操作的SQL查詢輸出被調用
  2. 您收到此錯誤的文件名和行號

如果需要,可以在調用此控制器操作時發布整個rails日志輸出。 它感謝它將使它足夠神秘(我希望)能解決它。

換句話說 ,您的表單正在傳入的參數結構似乎與您的控制器期望的不一致,這可能是大多數問題。 因此,信不信由你,查看您的視圖,它生成的HTML,並嘗試找出為什么其中的參數與rails在結構和命名方面期望的不匹配的原因。 如果您能弄清楚,那將是您的最佳選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM