我正在尝试从我制作的连接表中删除,但我得到了一个奇怪的错误,我无法弄清楚。
以下是我的模特
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_id
和user_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>
答案 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
试一试