首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >活动记录销毁ArgumentError (参数数目错误(给定1,预期为0)):

活动记录销毁ArgumentError (参数数目错误(给定1,预期为0)):
EN

Stack Overflow用户
提问于 2016-12-16 01:53:45
回答 1查看 1.5K关注 0票数 0

我正试图摧毁这样的购买对象

代码语言:javascript
复制
def destroy
        @purchase=current_user.purchases.where(flooding_property_id: params[:id])
        @purchase.destroy(flooding_property_id: params[:id])
    end

我知道这个错误是因为我有某种联系,但我似乎搞不清楚。我的模型如下

代码语言:javascript
复制
class FloodingProperty < ActiveRecord::Base
    has_many :purchases 
    has_many :users, through: :purchases
end

采购模型

代码语言:javascript
复制
class Purchase < ActiveRecord::Base

    belongs_to :user
    belongs_to :flooding_property
end

用户模型

代码语言:javascript
复制
class User < ActiveRecord::Base

  has_many :purchases
  has_many :carts
  has_many :flooding_properties, through: :purchases
end

数据库模式:

代码语言:javascript
复制
create_table "flooding_properties", force: :cascade do |t|
    t.string    "address"
    t.string    "zipcode"
    t.geography "latlon",       limit: {:srid=>4326, :type=>"point", :geographic=>true}
    t.datetime  "last_updated"
    t.datetime  "created_at",                                                            null: false
    t.datetime  "updated_at",                                                            null: false
  end

  add_index "flooding_properties", ["latlon"], name: "index_flooding_properties_on_latlon", using: :gist
  add_index "flooding_properties", ["zipcode"], name: "index_flooding_properties_on_zipcode", using: :btree

  create_table "purchases", force: :cascade do |t|
    t.boolean  "billed",               default: false
    t.integer  "user_id"
    t.integer  "flooding_property_id"
    t.datetime "created_at",                           null: false
    t.datetime "updated_at",                           null: false
  end

  add_index "purchases", ["billed"], name: "index_purchases_on_billed", where: "(billed = false)", using: :btree
  add_index "purchases", ["flooding_property_id"], name: "index_purchases_on_flooding_property_id", using: :btree
  add_index "purchases", ["user_id"], name: "index_purchases_on_user_id", using: :btree

  create_table "users", force: :cascade do |t|
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
    t.string   "first_name"
    t.string   "last_name"
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
  end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-16 02:00:13

你在一个实例上调用# single。这不是你的协会的问题。

代码语言:javascript
复制
def destroy
  current_user
    .purchases
    .find_by(flooding_property_id: params[:id])
    .destroy
end

我使用的是.find_by而不是.where,因为.where返回多个匹配。.find_by总是返回它找到的第一个。

如果确实想销毁所有匹配项,可以使用.where和.destroy_all:

代码语言:javascript
复制
def destroy
  current_user
    .purchases
    .where(flooding_property_id: params[:id])
    .destroy_all
end
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41176138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档