2016-12-16 6 views
0

Я пытаюсь уничтожить объект купли-продажи, как этотActive Record Уничтожить ArgumentError (неверное число аргументов (данных 1, как ожидается 0)):

def destroy 
     @purchase=current_user.purchases.where(flooding_property_id: params[:id]) 
     @purchase.destroy(flooding_property_id: params[:id]) 
    end 

Я знаю, что ошибка происходит из-за какой-то ассоциации я есть, но я не могу понять это. Моя модель выглядит следующим образом

class FloodingProperty < ActiveRecord::Base 
    has_many :purchases 
    has_many :users, through: :purchases 
end 

Покупка модель-

class Purchase < ActiveRecord::Base 

    belongs_to :user 
    belongs_to :flooding_property 
end 

модели пользователя

class User < ActiveRecord::Base 

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

Схема базы:

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 

ответ

1

Вы называете #destroy на одном экземпляре. Это не проблема ваших ассоциаций.

def destroy 
    current_user 
    .purchases 
    .find_by(flooding_property_id: params[:id]) 
    .destroy 
end 

Я использую .find_by вместо .where, потому что .where возвращает несколько совпадений. .find_by всегда возвращает первый найденный.

Если вы действительно хотите, чтобы уничтожить все матчи можно использовать .гд и .destroy_all:

def destroy 
    current_user 
    .purchases 
    .where(flooding_property_id: params[:id]) 
    .destroy_all 
end 
+0

Wow, который решает его. Спасибо огромное! Первоначально я думал, что это проблема, но я попробовал @ purchase.first.destroy (flooding_property_id: params [: id]), но это не сработало. – beewuu

+0

Это здорово. Не могли бы вы отметить мой ответ? –

 Смежные вопросы

  • Нет связанных вопросов^_^