Ruby on rails Rails多对一关联

Ruby on rails Rails多对一关联,ruby-on-rails,associations,Ruby On Rails,Associations,嗨,我是rails新手,从一个简单的应用程序开始,它有许多“任务”,每个任务都有一个“标签”。因此,这种关系就像——许多“任务”都有一个/相同的“标签”。我如何在我的模型中提出这一点。我用“任务”有一个“标记”和一个“标记”属于“任务”规则,但它只对第一个带有该标记的“任务”有效,而对其他带有相同“标记”的“任务”无效。请给我建议正确的方法。谢谢:) 类任务“id” 结束 类标记

嗨,我是rails新手,从一个简单的应用程序开始,它有许多“任务”,每个任务都有一个“标签”。因此,这种关系就像——许多“任务”都有一个/相同的“标签”。我如何在我的模型中提出这一点。我用“任务”有一个“标记”和一个“标记”属于“任务”规则,但它只对第一个带有该标记的“任务”有效,而对其他带有相同“标记”的“任务”无效。请给我建议正确的方法。谢谢:)

类任务“id”
结束
类标记
您的问题可能是,使用外键“id”意味着您使用标签表“id”列作为密钥,这是不合逻辑的。在这种情况下,id为1的任务认为它将与id为1的标记相关联

如果您使用RAILs约定设置迁移,我假设您在tags表中有一列记录任务id。。在这种情况下,我认为您只需要这些关联:

 class Task < ActiveRecord::Base
   has_many :logs
   has_one :tag
 end

 class Tag < ActiveRecord::Base
   belongs_to :task
 end
类任务
同样,这将假设您有一个名为“task_id”的标记属性。如果您将其保存在非常规键中,例如“custom_name_task_id”,它将更改为

 class Task < ActiveRecord::Base
   has_many :logs
   has_one :tag, :foreign_key => "custom_name_task_id"
 end

 class Tag < ActiveRecord::Base
   belongs_to :task
 end
类任务“自定义\u名称\u任务\u id”
结束
类标记
在我看来,你已经改变了这种关联——我所见过的每一位Rails新手都在他们的第一个项目中完成了这项工作

你想要的是

class Task < ActiveRecord::Base
  has_many :logs
  belongs_to :tag
end

class Tag < ActiveRecord::Base
  has_many :tasks
end
类任务

这样想吧——如果你点击一个标签,你会看到一个包含该标签的所有任务的列表。所以标签有很多任务,每个任务都属于一个标签。这与您描述项目的方式相匹配。Has_one用于一对一关系,其中每个任务都有自己的唯一标记。

如果我理解正确,那么您希望一个任务只有一个标记,但该标记可以属于多个任务,关联是反向的。在任务中需要一个
属于:标记
,而
在标记中有许多:任务

但是,我认为您可能最终会希望一个任务有多个标记,我认为最好从一开始就建立M-M关系,比如:

class Task < ActiveRecord::Base
  has_many :tagged_tasks
  has_many :tags, through: :tagged_tasks
end

class Tag < ActiveRecord::Base
  has_many :tagged_tasks
  has_many :tasks, through: :tagged_tasks
end

class TaggedTask < ActiveRecord::Base
  belongs_to :task
  belongs_to :tag
end
类任务

这允许您为任务设置多个标记,但您可能只需要使用gem即可。您可以为任务和标记设置一些属性信息吗?不,任务表记录了它应有的标记。你的是另一条路。哦,好的。你的解释把我弄糊涂了。不管怎样,金黑根明白了,一切都很好,因为他的回答是正确的。谢谢你的解释!
class Task < ActiveRecord::Base
  has_many :tagged_tasks
  has_many :tags, through: :tagged_tasks
end

class Tag < ActiveRecord::Base
  has_many :tagged_tasks
  has_many :tasks, through: :tagged_tasks
end

class TaggedTask < ActiveRecord::Base
  belongs_to :task
  belongs_to :tag
end