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