Ruby on rails 3 奇怪的删除空错误

Ruby on rails 3 奇怪的删除空错误,ruby-on-rails-3,Ruby On Rails 3,我正在尝试从我创建的联接表中删除,但我遇到了一个奇怪的错误,我无法理解 这是我的模型 class ArticlesUser < ActiveRecord::Base # attr_accessible :title, :body belongs_to :user belongs_to :article end class Article < ActiveRecord::Base attr_accessible :title belongs_to :user has_m

我正在尝试从我创建的联接表中删除,但我遇到了一个奇怪的错误,我无法理解

这是我的模型

class ArticlesUser < ActiveRecord::Base
 # attr_accessible :title, :body
 belongs_to :user
 belongs_to :article
end

class Article < ActiveRecord::Base
 attr_accessible :title
 belongs_to :user

 has_many :articles_users
 has_many :likes, :through => :articles_users, :class_name => 'User', :source => :user    
end

class User < ActiveRecord::Base 
 has_many :articles, :order => 'id DESC'
 has_and_belongs_to_many :badges

 has_many :articles_users
 has_many :likes, :through => :articles_users, :class_name => 'Article', :source => :article
end
这里有一个错误:

 ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'articles_users.' in 'where clause': DELETE FROM `articles_users` WHERE `articles_users`.`` = NULL
为什么它似乎完全忽略了where散列?请帮帮我,我今天花了好几个小时想弄明白

谢谢

编辑:

articles\u users表有两列:article\u id和user\u id

编辑:

这是从控制台复制和粘贴的:

1.9.3p194 :004 > a.articles_users.where(user_id: 3).first
ArticlesUser Load (0.7ms)  SELECT `articles_users`.* FROM `articles_users` WHERE    `articles_users`.`article_id` = 13 AND `articles_users`.`user_id` = 3 LIMIT 1
=> #<ArticlesUser user_id: 3, article_id: 13> 

我也遇到过同样的问题,但我在我的代码中尝试过这一点-:

@cart = Cart.where(:user_id => current_user.id).first
@item = @cart.cart_items.where(:product_id => params[:product_id]).first
@item.destroy
或者在您的代码中,您可以尝试使用以下方法

@a=a.articles_users.where(user_id: 3).first
@a.destroy

试试看

我试过并复制了你的文章

从输出来看,ArticlesUser中似乎没有id列 这是问题的原因

=> #<ArticlesUser user_id: 3, article_id: 13> 
销毁记录时,rails将其id用作引用,以将其从数据库中删除

检查示例

 DELETE FROM `articles_users` WHERE `articles_users`.`id` = 1

如果您感兴趣,我找到了一个没有主键的解决方案

编辑:非常接近这个:,但我相信我的解决方案更对称

首先,我遵循了其中的一部分: 我只在config/routes.rb中更改了这一行:

resources :users
为此:

resources :users do
  resources :articles, :controller => 'ArticleUsers', :only => [:index, :create, :destroy]
end
然后生成ArticleUsers控制器并创建如下方法:

def delete_article
  @user.articles.delete(@article)
  redirect_to user_articles_path
end
您还需要为@user:

def find_user
  @user = User.find(params[:user_id]
end
@article也有一个类似的例子,请注意,如果您遵循了上面的链接,那么可能需要将params[:id]替换为params[:article_id]

然后在routes.rb中添加:

match '/users/:user_id/articles/delete_article/:id', :controller => 'ArticleUsers', :action => 'delete_article'
请注意,如果您使用的不是Rails 3而是Rails 4,则应将match替换为map.connect

如果使用slim编写,如果@items包含用户的所有文章,则在索引中:

 - @items.each do |articleuser|
   tr
     td= articleuser.article.title

     td
       = link_to "article/delete_article/#{articleuser.article_id}",\
         data: { confirm: 'Confirm ?' } do
         i.icon-trash.icon.icon-large
这适用于我必须在表中显示链接的情况,但您可以轻松地将其调整为您的链接

此方法避免使用真正需要ID的destroy方法


这花了我一些时间和几个来源得到这个,我希望它将帮助别人

@Deekor在控制台中检查此行是否工作a.articles\u users.whereuser\u id:3.first a.articles\u users.whereuser\u id:3的输出是什么。first@priteshJ刚刚用你的问题的答案更新了这个问题。我认为在连接表上有一个ID列是不好的做法?看起来rails在内部以某种方式使用它
match '/users/:user_id/articles/delete_article/:id', :controller => 'ArticleUsers', :action => 'delete_article'
 - @items.each do |articleuser|
   tr
     td= articleuser.article.title

     td
       = link_to "article/delete_article/#{articleuser.article_id}",\
         data: { confirm: 'Confirm ?' } do
         i.icon-trash.icon.icon-large