【问题标题】:Error, statement invalid. simple model method not functioning correctly错误,声明无效。简单模型方法无法正常运行
【发布时间】:2013-06-21 16:47:29
【问题描述】:

我正在尝试创建一个似乎无法正确访问其关联模型信息的对象。在这种情况下,我的语法有什么问题以及最佳实践是什么?以下是我的代码和错误:

控制器

class LineItemsController < ApplicationController
  def new
    @line_item = LineItem.new
  end
  def create
    @line_item = LineItem.create!(params[:line_item].merge(:cart => current_cart))
    @line_item.update_attributes!(:unit_price => @line_item.item_price)
    redirect_to current_cart_url
  end
end

型号

class LineItem < ActiveRecord::Base
  attr_accessible :cart_id, :product_id, :quantity, :unit_price, :product, :cart, :color_id, :size_id, :extra_id, :color, :size, :extra
  belongs_to :cart
  belongs_to :product
  has_one :color
  has_one :size
  has_one :extra
  validates :quantity, :presence => true
  def item_price
    if size.price.nil? || size.price == 0
      if  extra.price.nil? || extra.price ==0
        product.price
      else
        product.price + extra.price
      end
    else
      if extra.price.nil? || extra.price == 0
        product.price + size.price
      else
        product.price + size.price + extra.price
      end
    end
  end
  def full_price
          unit_price * quantity
  end
end

错误

ActiveRecord::StatementInvalid at /line_items
PG::Error: ERROR:  column sizes.line_item_id does not exist
LINE 1: SELECT  "sizes".* FROM "sizes"  WHERE "sizes"."line_item_id"...
                                              ^
: SELECT  "sizes".* FROM "sizes"  WHERE "sizes"."line_item_id" = 4 LIMIT 1

ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#log
activerecord (3.2.13) lib/active_record/connection_adapters/abstract_adapter.rb, line 285
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#log
activerecord (3.2.13) lib/active_record/connection_adapters/abstract_adapter.rb, line 275
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#exec_query
activerecord (3.2.13) lib/active_record/connection_adapters/postgresql_adapter.rb, line 659
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#select
activerecord (3.2.13) lib/active_record/connection_adapters/postgresql_adapter.rb, line 1256
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#select_all
activerecord (3.2.13) lib/active_record/connection_adapters/abstract/database_statements.rb, line 18
block in ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#select_all
activerecord (3.2.13) lib/active_record/connection_adapters/abstract/query_cache.rb, line 61
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#cache_sql
activerecord (3.2.13) lib/active_record/connection_adapters/abstract/query_cache.rb, line 75
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter#select_all
activerecord (3.2.13) lib/active_record/connection_adapters/abstract/query_cache.rb, line 61
block in Size.find_by_sql
activerecord (3.2.13) lib/active_record/querying.rb, line 38
Size.logging_query_plan
activerecord (3.2.13) lib/active_record/explain.rb, line 41
Size.find_by_sql
activerecord (3.2.13) lib/active_record/querying.rb, line 37
ActiveRecord::Relation#exec_queries
activerecord (3.2.13) lib/active_record/relation.rb, line 171
block in ActiveRecord::Relation#to_a
activerecord (3.2.13) lib/active_record/relation.rb, line 160
ActiveRecord::Relation#logging_query_plan
activerecord (3.2.13) lib/active_record/explain.rb, line 34
ActiveRecord::Relation#to_a
activerecord (3.2.13) lib/active_record/relation.rb, line 159
ActiveRecord::Relation#find_first
activerecord (3.2.13) lib/active_record/relation/finder_methods.rb, line 380
ActiveRecord::Relation#first
activerecord (3.2.13) lib/active_record/relation/finder_methods.rb, line 122
ActiveRecord::Associations::HasOneAssociation#find_target
activerecord (3.2.13) lib/active_record/associations/singular_association.rb, line 42
ActiveRecord::Associations::HasOneAssociation#load_target
activerecord (3.2.13) lib/active_record/associations/association.rb, line 145
ActiveRecord::Associations::HasOneAssociation#reload
activerecord (3.2.13) lib/active_record/associations/association.rb, line 55
ActiveRecord::Associations::HasOneAssociation#reader
activerecord (3.2.13) lib/active_record/associations/singular_association.rb, line 9
block in LineItem#product
activerecord (3.2.13) lib/active_record/associations/builder/association.rb, line 44
LineItem#item_price
app/models/line_item.rb, line 10
LineItemsController#create
app/controllers/line_items_controller.rb, line 7

感谢任何见解

【问题讨论】:

  • 错误显示ERROR: column sizes.line_item_id does not exist - 尝试运行此psql YOUR_DB_NAME -c "\d sizes" 它将显示您的尺寸表上的所有信息,猜测它没有该列?可能需要运行 db:migrate 或者列命名有错误?

标签: ruby-on-rails methods parameters model associations


【解决方案1】:

你跑rake db:migrate了吗?

编辑:: 好的,看看堆栈跟踪,我们有 line_items_controller.rb, line 7 @line_item.item_price ,它又调用了 line_item.rb, line 10,即 if size.price.nil? || size.price == 0

所以错误在于调用sizeSize.find_by_id(4) 在控制台中给你什么?

编辑:: 另外我认为您的关联不正确-我认为sizes 表不应该有line_item_id 列,而是line_items 表应该有size_id 列。在这种情况下,您需要belongs_to :size

【讨论】:

  • 看起来 size 是 nil
  • 来自 rails 控制台:#
猜你喜欢
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多