奇怪的删除空错误

时间:2012-07-26 04:06:52

标签: 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_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

在Rails控制台中进行测试,您可以看到错误:

> a = Article.find(13) 
> a.articles_users #works fine, returns an array of users who "like" the article
> a.articles_users.where(user_id: 3) #works as well
> a.articles_users.where(user_id: 3).first.destroy #this is where the error is thrown!

这里有错误:

 ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'articles_users.' in 'where clause': DELETE FROM `articles_users` WHERE `articles_users`.`` = NULL

为什么它似乎完全忽略了where hash?请帮助我,今天我花了好几个小时试图解决这个问题。

谢谢!

修改

articles_users表有两列:article_iduser_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> 

3 个答案:

答案 0 :(得分:3)

我试过并重现了你的问题。

从您的输出中,您似乎在ArticlesUser中没有id列 这是问题的原因。

=> #<ArticlesUser user_id: 3, article_id: 13> 

我尝试在表格中添加id列,它就像魅力一样。 创建了一个新的迁移并添加它

 add_column :articles_users, :id, :primary_key

当您销毁记录时,使用其id作为参考将其从数据库中删除。

检查示例。

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

答案 1 :(得分:2)

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

编辑:它非常接近这个:Deleting just a join table record in Ruby on Rails,但我相信我的解决方案更加对称。

首先我遵循了部分内容:http://ngauthier.com/2010/11/restful-many-to-many-relationships-in-rails.html 我只更改了我的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方法。

我花了一些时间和几个来源来实现这个目标,我希望它会帮助别人!

答案 2 :(得分:0)

快速浏览..我也面临同样的问题,但我在我的代码中尝试了这个 - :

@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

试一试