Ruby on rails 使用两者有一个和多个关联
我试图在一个模型中有一个和多个方法。taskflow可以有许多任务,但也有一个默认任务 我试图在taskflow表中创建一列,其中包含任务的id。但是,当我尝试设置默认任务时,它不起作用Ruby on rails 使用两者有一个和多个关联,ruby-on-rails,ruby-on-rails-4,associations,Ruby On Rails,Ruby On Rails 4,Associations,我试图在一个模型中有一个和多个方法。taskflow可以有许多任务,但也有一个默认任务 我试图在taskflow表中创建一列,其中包含任务的id。但是,当我尝试设置默认任务时,它不起作用 class Taskflow < ActiveRecord::Base has_many :tasks has_one :default_task, :class_name => 'Task' class Task < ActiveRecord::Base belon
class Taskflow < ActiveRecord::Base
has_many :tasks
has_one :default_task, :class_name => 'Task'
class Task < ActiveRecord::Base
belongs_to :taskflow
当taskflow默认任务值保持为“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
class CreateTaskflows
我让它起作用了。模型中需要的不是有一个
,而是属于
class Taskflow < ActiveRecord::Base
has_many :tasks
belongs_to :default_task, :class_name => 'Task'
class Task < ActiveRecord::Base
belongs_to :taskflow
class Taskflow“任务”
类任务
我认为这与我的假设相反。
has_one用于指定与另一类的一对一关联。仅当其他类包含外键时,才应使用此方法
在您的情况下,您应该使用属于,因为默认的任务引用在TaskFlow模型中(在您的迁移中)
TaskFlow模型有两种关系:
- TaskFlow有许多任务
- TaskFlow有一个特定的任务作为默认任务
类Taskflow“任务”
类任务
按照您的方式,Rails不知道哪个任务是默认任务。我将以不同的方式实现它。我将在任务模型上创建一个布尔字段default_task。Taskflow将具有以下一个或多个关联:
class Taskflow < ActiveRecord::Base
has_many :tasks
has_one :default_task, class_name: 'Task', condition: proc{"tasks.default_task = true"}
class Taskflow
从语义上讲,Taskflow应该有许多任务,并且在这些任务中有一个默认任务。在我看来,taskflow属于默认任务听起来有点做作
您还可以添加一项功能,以将单个任务持续维护为默认任务(位设置为true,更多详细信息),或在创建任务流时创建默认任务。这完全取决于你的要求
而且,如果您仍然希望在Taskflow模型上保留默认的\u task\u id列并使用has\u one关联,则可以执行以下操作:
class Taskflow < ActiveRecord::Base
has_many :tasks
has_one :default_task, class_name: "Task", primary_key: "default_task_id", foreign_key: "id"
class Taskflow
这里的人对属于谁或如何破解谁都是正确的。我理解,在这种情况下,“属于”并不合适,但若您在表中使用“引用”,通常您总是希望使用“属于”。因此我假设将任务本身上的默认任务标记为默认任务-但是如果它们可以是不同任务流的一部分,其中不同的任务可能是默认任务-那么当然这是不可能的
这里已经提到的另一个选项是:您可以将范围添加到has_many:tasks关系中。像这样:
has_many :tasks do
def default
joins(:task_flow).where('tasks.id = task_flows.default_task_id').first
end
end
然后你可以要求
@task_flow.tasks.default
首先,看起来您从未设置任务,因此“taskflow1.default_task=task”将默认_task设置为nil,因为从未设置任务。所有TaskFlow是否都具有相同的默认任务,或者在TaskFlow实例之间是否会发生更改?很抱歉,这是一个输入错误。taskflow实例之间的默认任务可能不同。非常感谢。使用“属于”意味着一个任务有一个或多个任务流,即使您没有明确说明这种关联。这是否准确地反映了您的需求?我看不出它与范围有什么不同(只是不太清楚),但是,Rails非常好,因为您可以用多种方式表达内容,使其清晰并适合特定情况。顺便说一句,关于有一个“黑客”,它不是一个黑客<
中的code>condition
参数has_one和has_many
是一种定义良好且有用的自定义关联行为。我称之为“hack”,因为它与约定相矛盾。我想您至少可以同意,您已经配置了很多,使has_one在这里的数据模型中工作。编辑-附言:我刚刚查看了你当前的答案。通过布尔值来标记它并不像是黑客。但是,重新配置主键和外键来执行与约定几乎相反的操作对我来说确实像是一种“黑客行为”^^^好吧,我称之为“黑客行为”,这种行为只是为了使某些东西工作,即使它没有真正反映出所需的设计。让我们以我们当前的案例为例。RobotEyes用于Taskflow中的默认任务,同时Taskflow有许多任务。这听起来甚至有些做作:任务流有许多任务,属于默认任务。更好的版本应该是:taskflow有许多任务,其中一个是默认任务(我仍然认为任务上的bool是更好的解决方案,因为它允许您以后有多个默认任务)。仅因为它以这种方式开始工作,所以才使用它,但它真的反映了设计思想吗?与其他框架相比,Rails的一个巨大优点是它非常具有表现力,并且允许您在代码中反映各种建模。有相当严格的定义
@task_flow.tasks.default