【问题标题】:ActiveRecord deleting all records instead of oneActiveRecord 删除所有记录而不是一条
【发布时间】:2015-03-09 21:34:01
【问题描述】:

我正在尝试删除用户订阅,但是当我点击类似时,current_user 的所有订阅都会被删除,而不仅仅是目标用户。唯一似乎有效的是原始 sql

执行sql

conn = ActiveRecord::Base.connection
    conn.execute(%Q{
        delete from user_subscriptions
        where user_id = #{user_id}
        and app_id = #{app_id}
})

app/controllers/user_subscriptions_controller.rb

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

app/views/apps/_full.html.erb

...
<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>

db/迁移

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

config/routes.rb

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'

app/models/user_subscription.rb

class UserSubscription < ActiveRecord::Base
  belongs_to :user
  belongs_to :app
end

app/models/app.rb

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 }

app/models.user.rb

class User < ActiveRecord::Base
  has_many :user_subscriptions
  has_many :apps, through: :user_subscriptions

app/controllers/apps_controller.rb

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

【问题讨论】:

  • 它在 rails 控制台返回什么? UserSubscription.find_by(user_id: User.last.id, app_id: App.last.id)
  • 你的破坏动作是在 GET 动词下吗? 00
  • @BroiSatse 我已经更新了 routes.rb 中关于 user_subscriptions 的部分
  • @BroiSatse,应该是DELETE动词吧?
  • 来自手册:find_by 查找符合指定条件的第一条记录。 UserSubscription.find_by(user_id: user_id, app_id: app_id).destroy 仅删除一条记录。启动一个 Rails 控制台,为自己创建一个订阅多个应用程序的用户,然后针对此尝试您的代码并查看结果。而且你不应该使用 get 删除,为此使用 delete 动词。

标签: ruby-on-rails ruby activerecord ruby-on-rails-4.1


【解决方案1】:

也许会有所帮助。试试destroy_all

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

【讨论】:

    【解决方案2】:

    您需要使用DELETE 动词而不是GET

    routes.rb

    delete 'user_subcriptions/destroy/:user_id/:app_id', to: 'user_subscriptions#destroy', as: 'destroy_subscription'
    

    并锚定于此:

    app/views/apps/_full.html.erb

    <%= link_to 'stop notifications', destroy_subscription_path(session[:user_id], app.id), method: :delete %>
    

    【讨论】:

    • 它的行为仍然相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2020-06-11
    相关资源
    最近更新 更多