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 ハッシュを完全に無視しているように見えるのはなぜですか? 今日何時間もかけて理解しようとしてきたことで私を助けてください。

ありがとう!

編集:

articles_usersテーブルには次の2 つの列が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> 
4

3 に答える 3

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
于 2012-07-27T15:56:34.517 に答える
2

興味があれば、主キーのない解決策を見つけました。

編集:これにかなり近いです: 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([:article_id]) の代わりに params([:id]) を配置する必要がある場合があることに注意してください)

次に、routes.rb に以下を追加します。

match '/users/:user_id/articles/delete_article/:id', :controller => 'ArticleUsers', :action => 'delete_article'

Rails 3 ではなく Rails 4 を使用している場合は、「match」を「map.connect」に置き換える必要があることに注意してください。

次に、 @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 メソッドの使用を回避します。

これにたどり着くまでに時間がかかり、いくつかの情報源がありました。他の人の助けになることを願っています!

于 2014-06-06T13:06:07.927 に答える
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

試してみる

于 2012-07-26T08:10:54.097 に答える