Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActiveRecord删除所有记录而不是一条记录_Ruby On Rails_Ruby_Activerecord_Ruby On Rails 4.1 - Fatal编程技术网

Ruby on rails ActiveRecord删除所有记录而不是一条记录

Ruby on rails ActiveRecord删除所有记录而不是一条记录,ruby-on-rails,ruby,activerecord,ruby-on-rails-4.1,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 4.1,我正在尝试删除用户订阅,但当我单击“与当前用户的所有订阅相同”时,将删除当前用户的所有订阅,而不是仅删除目标用户的订阅。唯一有效的方法是原始sql 执行sql app/controllers/user\u subscriptions\u controller.rb app/models/user_subscription.rb class-UserSubscription

我正在尝试删除用户订阅,但当我单击“与当前用户的所有订阅相同”时,将删除当前用户的所有订阅,而不是仅删除目标用户的订阅。唯一有效的方法是原始sql

执行sql app/controllers/user\u subscriptions\u controller.rb app/models/user_subscription.rb
class-UserSubscription
app/models/app.rb
class-App
app/models.user.rb
class用户
app/controllers/apps\u controller.rb
class AppsController
您需要使用
DELETE
动词,而不是
GET

routes.rb

并锚定到这一点:

app/views/apps/_full.html.erb


也许会有帮助。试着把你全部消灭

UserSubscription.destroy_all(user_id: user_id, app_id: app_id)

它在rails控制台中返回什么
UserSubscription.find\u by(user\u id:user.last.id,app\u id:app.last.id)
您的销毁操作是否在GET动词下?00@BroiSatse我已经更新了routes.rb中有关用户的部分_subscriptions@BroiSatse,它应该是手册中的DELETE verb,对吗?:find_by查找与指定条件匹配的第一条记录
UserSubscription.find_by(user_id:user_id,app_id:app_id)。destroy
仅删除一条记录。启动rails控制台,为自己创建一个具有多个应用程序订阅的用户,然后针对该应用程序尝试您的代码并查看结果。您不应该使用get删除,而应该使用delete动词。它的行为仍然相同
class UserSubscriptionsController < ApplicationController
  ...

  def destroy
    user_id = params[:user_id]
    app_id = params[:app_id]
    UserSubscription.find_by(user_id: user_id, app_id: app_id).destroy
    flash[:notice] = 'You will no longer receive notifications of new builds.'
    redirect_to root_path
  end
end
...
<h5 class='caption-text cols-lg-12'>
  <% if @subs.include? app.id %>
    <%= link_to 'stop notifications', destroy_subscription_path(session[:user_id], app.id) %>
  <% else %>
    <%= link_to 'recieve notifications', create_subscription_path(session[:user_id], app.id) %>
  <% end %>
</h5>
class CreateUserSubscriptions < ActiveRecord::Migration
  def change
    create_join_table :users, :apps, table_name: 'user_subscriptions'
    execute 'ALTER TABLE user_subscriptions ADD PRIMARY KEY (user_id, app_id);'
  end
end
get 'user_subcriptions/create/:user_id/:app_id', to: 'user_subscriptions#create', as: 'create_subscription'
get 'user_subcriptions/destroy/:user_id/:app_id', to: 'user_subscriptions#destroy', as: 'destroy_subscription'
class UserSubscription < ActiveRecord::Base
  belongs_to :user
  belongs_to :app
end
class App < ActiveRecord::Base
  has_many :versions
  has_many :user_subscriptions
  has_many :users, through: :user_subscriptions
  validates :name, uniqueness: { case_sensitive: false, scope: :app_type }
class User < ActiveRecord::Base
  has_many :user_subscriptions
  has_many :apps, through: :user_subscriptions
class AppsController < ApplicationController
  def index
    redirect_to root_path unless user_signed_in?
    apps = App.order(name: :asc).all
    @subs = @current_user.user_subscriptions.map(&:app_id) || []
    @android_apps = apps.select { |a| a.app_type == 'android' } unless iphone? || ipad?
    if iphone? || ipad?
      @ios_apps = apps.includes(:versions).select do |app|
        app.iphone? == iphone? && app.ipad? == ipad?
      end
    elsif android? == false
      @ios_apps = apps.includes(:versions).select do |app|
        app.ipad? || app.iphone?
      end
    end
  end
end
delete 'user_subcriptions/destroy/:user_id/:app_id', to: 'user_subscriptions#destroy', as: 'destroy_subscription'
<%= link_to 'stop notifications', destroy_subscription_path(session[:user_id], app.id), method: :delete %>
UserSubscription.destroy_all(user_id: user_id, app_id: app_id)