2

Railsは初めてなので、簡単な間違いを犯したと思います。

2つのモデルの間に多対多の関係を設定しました:UserGroup。それらはジャンクションモデルを介して接続されていますGroupMember

これが私のモデルです(無関係なものを削除しました):

class User < ActiveRecord::Base
  has_many :group_members
  has_many :groups, :through => :group_members
end

class GroupMember < ActiveRecord::Base
  belongs_to :group
  belongs_to :user
end

class Group < ActiveRecord::Base
  has_many :group_members
  has_many :users, :through => :group_members
end

の表にGroupMembersは、関係に関する追加情報が含まれているため、使用しませんでしhas_and_belongs_to_manyた(Railsの「ActiveRecordAssociations」ガイドによる)。

私が抱えている問題は、を破壊できないことですGroupMember

Railsコンソールからの出力は次のとおりです。

irb(main):006:0> m = GroupMember.new
=> #<GroupMember group_id: nil, user_id: nil, active: nil, created_at: nil, updated_at: nil>
irb(main):007:0> m.group_id =1
=> 1
irb(main):008:0> m.user_id = 16
=> 16
irb(main):009:0> m.save
=> true
irb(main):010:0> m.destroy
NoMethodError: undefined method `eq' for nil:NilClass
    from /usr/local/lib/ruby/gems/1.8/gems/activesupport-3.0.4/lib/active_support/whiny_nil.rb:48:in `method_missing'
    from /usr/local/lib/ruby/gems/1.8/gems/activerecord-3.0.4/lib/active_record/persistence.rb:79:in `destroy'
    from /usr/local/lib/ruby/gems/1.8/gems/activerecord-3.0.4/lib/active_record/locking/optimistic.rb:110:in `destroy'
    from /usr/local/lib/ruby/gems/1.8/gems/activerecord-3.0.4/lib/active_record/callbacks.rb:260:in `destroy'
    from /usr/local/lib/ruby/gems/1.8/gems/activesupport-3.0.4/lib/active_support/callbacks.rb:413:in `_run_destroy_callbacks'
    from /usr/local/lib/ruby/gems/1.8/gems/activerecord-3.0.4/lib/active_record/callbacks.rb:260:in `destroy'
    from /usr/local/lib/ruby/gems/1.8/gems/activerecord-3.0.4/lib/active_record/transactions.rb:235:in `destroy'
    from /usr/local/lib/ruby/gems/1.8/gems/activerecord-3.0.4/lib/active_record/transactions.rb:292:in `with_transaction_returning_status'
    from /usr/local/lib/ruby/gems/1.8/gems/activerecord-3.0.4/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction'
    from /usr/local/lib/ruby/gems/1.8/gems/activerecord-3.0.4/lib/active_record/transactions.rb:207:in `transaction'
    from /usr/local/lib/ruby/gems/1.8/gems/activerecord-3.0.4/lib/active_record/transactions.rb:290:in `with_transaction_returning_status'
    from /usr/local/lib/ruby/gems/1.8/gems/activerecord-3.0.4/lib/active_record/transactions.rb:235:in `destroy'
    from (irb):10

これは私を夢中にさせているので、どんな助けでも大歓迎です。

4

5 に答える 5

5

HABTM関係からhas_many:through関係に切り替えたとき、id列を追加し直すのを忘れたようです。アクティブレコードでは、GroupMemberが.destroyをそのように機能させるためのIDを持っている必要があります。

移行でを探して、:id => falseそれを取り除きます。次に、移行をやり直します。

お役に立てば幸いです。

于 2011-02-25T19:32:16.433 に答える
0

m.reload.destroyの代わりにm.destroy、何が起こるかを確認しようとしましたか?

于 2011-02-25T03:30:07.590 に答える
0

データベースのgroup_membersテーブルに主キーがないと思います。多分あなたはそれを設定しませんでした。したがって、新しいGroupMemberオブジェクトを作成して保存するとき、そのオブジェクトにはIDがありません。id(主キー)なしでオブジェクトを破棄することはできません。

于 2011-02-25T19:35:58.560 に答える
0

私はあなたが説明しているのと同じ問題に遭遇し、あなたの投稿は私に解決策をさらに探すようにさせました。これは私が見つけたものです:

1-この複合主キーライブラリをhttp://compositekeys.rubyforge.org/から取得 します2-gemファイルに追加します3-GroupMemberに以下を追加しますset_primary_keys[:user_id、:group_id]

  • set_primary_keyではなくset_primary_keysに注意してください

これにより、destroyが.primary_keyを検索するときにGroupMember.primary_keyを呼び出すと、正しいプライマリが返されます。これで、それが検出されます。

コンソールで試してみてください:gm = GroupMember.first gm.destroy

これがお役に立てば幸いです=)

于 2011-03-20T15:36:30.663 に答える
0

アソシエーションを使用していて、何らかの理由でActive RecordsのデフォルトIDを使用しないことを選択した場合は、「set_primary_key」を使用してデフォルトIDを設定できるため、findやdestroyなどのメソッドが正しく機能します。

class User < ActiveRecord::Base
  set_primary_key :user_primary
  has_many :group_members, :dependent => :destroy
  has_many :groups, :through => :group_members
end

class GroupMember < ActiveRecord::Base
  set_primary_key :group_member_primary
  belongs_to :group
  belongs_to :user
end

class Group < ActiveRecord::Base
  set_primary_key :group_primary
  has_many :group_members, :dependent => :destroy
  has_many :users, :through => :group_members
end
于 2011-06-25T17:08:51.237 に答える