2

我是 Rails 的新手,所以我确定我犯了一个简单的错误。

我在两个模型之间建立了多对多关系:UserGroup. 它们通过 junction model 连接起来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“活动记录关联”指南)。

我遇到的问题是我无法销毁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

我遇到了您描述的相同问题,您的帖子让我进一步寻找解决方案。这是我发现的:

1- 从http://compositekeys.rubyforge.org/获取此复合主键库 2- 将其添加到您的 gem 文件 3- 将以下内容添加到 GroupMember set_primary_keys [:user_id, :group_id]

  • 注意 set_primary_keys 而不是 set_primary_key

当您在 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 回答
0

我认为您在数据库中的 group_members 表没有主键。也许你没有设置它。因此,当您创建一个新的 GroupMember 对象并保存它时,它不会有 id。没有 id(主键)就不能销毁对象。

于 2011-02-25T19:35:58.560 回答
0

您是否尝试过m.reload.destroy代替m.destroy, 看看会发生什么?

于 2011-02-25T03:30:07.590 回答