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