ruby-on-rails - 依赖销毁不起作用,has_many :model, :dependent => :destroy

标签 ruby-on-rails

在具有以下设置的 Rails 2.3 应用程序上,为什么项目被销毁时我的依赖的 project_endorsements 没有被销毁?

项目模型

class Project < ActiveRecord::Base
  #...
  has_many :project_endorsements, :dependent => :destroy
  #...
end

项目背书模型

class ProjectEndorsement < ActiveRecord::Base
  belongs_to :project
end 

我的架构

create_table "projects", :force => true do |t|
  #...
  t.string   "data_type",                 :limit => 25
  #...
end

create_table "project_endorsements", :force => true do |t|
  t.integer  "project_id"
  t.integer  "contributor_id"
  t.text     "endorsement"
  t.integer  "sort_order",     :null => false
  t.datetime "created_at"
  t.datetime "updated_at"
end

add_index "project_endorsements", ["project_id"], :name => "index_project_id"

我失败的测试

require 'spec_helper'

describe ProjectEndorsement do

  let(:project) {  Project.create!( data_type: "Book") }

  let(:contributor) {
    Contributor.new(
      first_name: "Anthony",
      last_name: "Swindle",
      display_name: "Anthony Swindle"
    )
  }

  let(:project_endorsement) {
    ProjectEndorsement.create!(
      project_id: project,
      contributor_id: contributor,
      endorsement: "endorsement",
      sort_order: 1
    )
  }

  context "when a project is deleted" do
    before do
      project.destroy
    end

    it "should remove the project endorsement as a dependency" do
      project_endorsement.should be_blank
    end
  end

end
$ spec spec/models/project_endorsements_spec.rb 
F

1)
'ProjectEndorsement when a project is deleted should remove the project endorsement as a dependency' FAILED
expected blank? to return true, got false
spec/models/project_endorsements_spec.rb:30:in `block (3 levels) in <top (required)>'
/usr/local/rvm/gems/ruby-1.9.3-p545@production/bin/ruby_executable_hooks:15:in `eval'
/usr/local/rvm/gems/ruby-1.9.3-p545@production/bin/ruby_executable_hooks:15:in `<main>'

Finished in 0.171014146 seconds

1 example, 1 failure

编辑:更新 - 这是一个控制台示例,显示该项目无法识别 has_many 关联。这看起来非常相关...还显示背书未删除,可能是因为上面的 has_many 不起作用。

控制台示例

>> project = Project.create!(data_type: "Book");project.id
=> 11917
>> contributor = Contributor.first;contributor.id
=> 1
>> endorsement = ProjectEndorsement.create!(
?>       project_id: project,
?>       contributor_id: contributor,
?>       endorsement: "endorsement",
?>       sort_order: 1
>>     );endorsement.id
=> 6029
>> ProjectEndorsement.last.id
=> 6029
>> project.project_endorsements
NoMethodError: undefined method `project_endorsements' for #<Project:0x000000050b5040>
  from /usr/local/rvm/gems/ruby-1.9.3-p545@production/gems/activerecord-2.3.17/lib/active_record/attribute_methods.rb:275:in `method_missing'
  from (irb):10
  from /usr/local/rvm/rubies/ruby-1.9.3-p545/bin/irb:12:in `<main>'
>> project.destroy
=> #<Project id: 11917, data_type: "Book", created_at: "2014-05-08 13:42:22", updated_at: "2014-05-08 13:42:22">
>> ProjectEndorsement.last.id
=> 6029

最佳答案

看起来像你的

ProjectEndorsement.create!(
      project_id: project, # <-- Take a look here
      contributor_id: contributor,
      endorsement: "endorsement",
      sort_order: 1
    )

不属于项目。 为确保安全,请尝试检查控制台endorsement.project

你必须使用:

project_id: project.id,

project: project,

作为create!参数。

贡献者相同

关于ruby-on-rails - 依赖销毁不起作用,has_many :model, :dependent => :destroy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23527768/

相关文章:

javascript - FlatUI - 单选按钮 jQuery 兼容性

javascript - 浏览器中的 GSM 编码的 WAV 文件

ruby-on-rails - 如何显示没有时区的时间戳

ruby-on-rails - 如何修复 Rails 应用程序中的 "Invalid query parameters"错误?

ruby-on-rails - 创建空输入字段的简单形式关联

css - Bootstrap 在纯 html 和 rails 中有不同的行为

ruby-on-rails - Rails.cache.fetch 方法是原子的吗?

ruby-on-rails - Rails - 让用户在不破坏 session 的情况下从多个设备登录

ruby-on-rails - 设计 - 仅由管理员创建用户

ruby-on-rails - Haml/Ruby/Rails 有条件地添加元素?