ActiveRecord :: HasManyThroughCantAssociateThroughHasOneOrManyReflection与这些关联

时间:2015-07-22 13:10:51

标签: ruby-on-rails ruby-on-rails-4 activerecord

我有这些模特:

FamilyTree

# == Schema Information
#
# Table name: family_trees
#
#  id         :integer          not null, primary key
#  name       :string(255)
#  user_id    :integer

class FamilyTree < ActiveRecord::Base
  attr_accessible :name
  belongs_to :user
  has_many :memberships, dependent: :destroy
  has_many :active_members, through: :memberships, source: :user, dependent: :destroy
  has_many :passive_members, through: :memberships, source: :member, dependent: :destroy
  has_many :nodes, dependent: :destroy
  has_many :members, through: :memberships, dependent: :destroy
end

Membership

# == Schema Information
#
# Table name: memberships
#
#  id                      :integer          not null, primary key
#  family_tree_id          :integer
#  user_id                 :integer
#  member_id               :integer

class Membership < ActiveRecord::Base
  belongs_to :family_tree
  belongs_to :user
  belongs_to :member    
end

Member

# == Schema Information
#
# Table name: members
#
#  id             :integer          not null, primary key
#  email          :string(255)
#  family_tree_id :integer
#

class Member < ActiveRecord::Base
    attr_accessor :relation 

    has_many :memberships, dependent: :destroy
    belongs_to :family_tree         
end

Node

# == Schema Information
#
# Table name: nodes
#
#  id                       :integer          not null, primary key
#  name                     :string(255)
#  family_tree_id           :integer
#  user_id                  :integer
#  media_id                 :integer

class Node < ActiveRecord::Base
  belongs_to :family_tree
  belongs_to :user
  belongs_to :media, polymorphic: true, dependent: :destroy
  has_many :comments, dependent: :destroy
  has_many :memberships, through: :family_tree, dependent: :destroy    
end

当我尝试删除node时,我收到此错误:

[109] pry(main)> n = Node.last
  Node Load (0.8ms)  SELECT  "nodes".* FROM "nodes"   ORDER BY "nodes"."id" DESC LIMIT 1
=> #<Node id: 102, name: "10PP Burpees", family_tree_id: 57, user_id: 57, media_id: 246>
[110] pry(main)> n.destroy
   (0.1ms)  BEGIN
  ActsAsTaggableOn::Tagging Load (1.4ms)  SELECT "taggings".* FROM "taggings"  WHERE "taggings"."taggable_id" = $1 AND "taggings"."taggable_type" = $2  [["taggable_id", 102], ["taggable_type", "Node"]]
  ActsAsTaggableOn::Tagging Load (0.5ms)  SELECT "taggings".* FROM "taggings" INNER JOIN "tags" ON "tags"."id" = "taggings"."tag_id" WHERE "taggings"."taggable_id" = $1 AND "taggings"."taggable_type" = $2 AND "taggings"."context" = 'user_tags'  [["taggable_id", 102], ["taggable_type", "Node"]]
  ActsAsVotable::Vote Load (0.5ms)  SELECT "votes".* FROM "votes"  WHERE "votes"."votable_id" = $1 AND "votes"."votable_type" = $2  [["votable_id", 102], ["votable_type", "Node"]]
  SQL (0.3ms)  DELETE FROM "votes" WHERE "votes"."id" = $1  [["id", 51]]
  Video Load (0.4ms)  SELECT  "videos".* FROM "videos"  WHERE "videos"."id" = $1 LIMIT 1  [["id", 246]]
  SQL (0.2ms)  DELETE FROM "videos" WHERE "videos"."id" = $1  [["id", 246]]
  Comment Load (0.3ms)  SELECT "comments".* FROM "comments"  WHERE "comments"."node_id" = $1  [["node_id", 102]]
  Membership Load (1.1ms)  SELECT "memberships".* FROM "memberships" INNER JOIN "family_trees" ON "memberships"."family_tree_id" = "family_trees"."id" WHERE "family_trees"."id" = $1  [["id", 57]]
   (0.3ms)  ROLLBACK
ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection: Cannot modify association 'Node#memberships' because the source reflection class 'Membership' is associated to 'FamilyTree' via :has_many.
from /.rvm/gems/ruby-2.1.6@myapp/gems/activerecord-4.1.12/lib/active_record/associations/through_association.rb:86:in `ensure_mutable'

我知道这个错误与关联有关,但我认为我太接近它了,我无法弄清楚导致这一特定问题的原因。

想法?

1 个答案:

答案 0 :(得分:0)

所以问题在我的Node.rb

中就是这一行
has_many :memberships, through: :family_tree, dependent: :destroy

我意识到我实际上并不需要它,所以我只是把它砍掉了。

解决了这个问题并摆脱了错误。