ruby-on-rails - 同时使用 has_one 和 has_many 关联

标签 ruby-on-rails ruby-on-rails-4 associations

我正在尝试在一个模型中使用 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

我为数据库播种,然后在 Rails 控制台中尝试将任务分配为任务流 default_task:
taskflow1 = Taskflow.first
task1 = Task.first
taskflow1.default_task = task1

这不适用于任务流 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

最佳答案

我会以不同的方式实现它。我会在 Task 模型上创建一个 bool 字段 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"}

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

您还可以添加一个功能来持续将单个任务维护为默认任务(位设置为 true,更多详细信息 here),或在创建任务流时创建默认任务。这一切都取决于您的要求。

并且,如果您仍然希望将 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"

关于ruby-on-rails - 同时使用 has_one 和 has_many 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37971856/

相关文章:

ruby-on-rails - 以不同方式访问时,得到相同模型的不同版本

ruby-on-rails - ActionMailer 响应 "501 5.5.4 Invalid argument"

java - 存储项目到项目关联的算法

jquery - 在页面上的多个输入上使用 tokeninput jquery 插件

ruby-on-rails - 将html表的值提交给 Controller ruby中的变量

ruby-on-rails - Rails 4 - 将日期时间转换为单独的日期和时间字段

ruby-on-rails - ActiveRecord 将 Rails 应用程序从 Sqlite 转换为 PostgreSQL 时出错

ruby-on-rails - Ruby on Rails - has_many 基于 "kind"

mysql - Rails 查询多个表的关联

ruby-on-rails - Rails 3 - 使用json上传图片