Ruby on rails ActiveRecord删除所有记录而不是一条记录
我正在尝试删除用户订阅,但当我单击“与当前用户的所有订阅相同”时,将删除当前用户的所有订阅,而不是仅删除目标用户的订阅。唯一有效的方法是原始sql 执行sql app/controllers/user\u subscriptions\u controller.rb app/models/user_subscription.rbRuby 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
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)