同时使用has_one和has_many关联

Rob*_*yes 3 ruby-on-rails associations ruby-on-rails-4

我正在尝试在一种模型中使用has_one和has_many方法。一个任务流可以有许多任务,但也有一个默认任务。

我正在尝试在任务流表中创建一个包含任务ID的列。但是,当我尝试设置该默认任务时,它将不起作用。

class Taskflow < ActiveRecord::Base
    has_many :tasks
    has_one :default_task, :class_name => 'Task'

class Task < ActiveRecord::Base
    belongs_to :taskflow
Run Code Online (Sandbox Code Playgroud)

我为数据库添加种子,然后在Rails控制台中尝试将任务分配为任务流default_task:

taskflow1 = Taskflow.first
task1 = Task.first
taskflow1.default_task = task1
Run Code Online (Sandbox Code Playgroud)

这与工作流default_task值保持为“ nil”不起作用。什么是达到预期行为的正确方法?

任何帮助将非常感激。

编辑

迁移文件为:

class CreateTaskflows < ActiveRecord::Migration
  def change
    create_table :taskflows do |t|
      t.string :title
      t.string :description
      t.references :default_task
      t.timestamps null: false
    end
  end
end

class CreateTasks < ActiveRecord::Migration
  def change
    create_table :tasks do |t|
      t.string :task_type
      t.text :help
      t.text :data
      t.belongs_to :taskflow
      t.timestamps null: false
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

小智 5

我会以不同的方式实现它。我将在任务模型上创建一个布尔字段default_task。Taskflow将具有以下has_one和has_many关联:

class Taskflow < ActiveRecord::Base
    has_many :tasks
    has_one :default_task, class_name: 'Task', condition: proc{"tasks.default_task = true"}
Run Code Online (Sandbox Code Playgroud)

从语义上讲,Taskflow应该有许多任务,并且在这些任务中有一个默认任务。我认为任务流属于默认任务听起来有些虚假。

您还可以添加一项功能,以将单个任务作为默认任务(其位设置为true,此处更多详细信息)不断维护,或在创建Taskflow时创建默认任务。这完全取决于您的要求。

并且,如果您仍然希望将default_task_id列包含在Taskflow模型上并使用has_one关联,则可以执行以下操作:

class Taskflow < ActiveRecord::Base
    has_many :tasks
    has_one :default_task, class_name: "Task", primary_key: "default_task_id", foreign_key: "id"
Run Code Online (Sandbox Code Playgroud)