首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails:三向has_many/直通关系:防止创建重复的连接项

Rails:三向has_many/直通关系:防止创建重复的连接项
EN

Stack Overflow用户
提问于 2013-12-04 11:23:38
回答 1查看 269关注 0票数 0

以下是我拥有的模型的摘录:

代码语言:javascript
运行
复制
class User < ActiveRecord::Base
  has_many :participations
  has_many :groups, through: :participations
  has_many :subgroups, through: :participations
end

class Group < ActiveRecord::Base
  has_many :participations
  has_many :users, through: :participations
  has_many :subgroups
end

class Subgroup < ActiveRecord::Base
  has_many :participations
  has_many :users, through: :participations
end

class Participation < ActiveRecord::Base
  belongs_to: :user
  belongs_to: :group
  belongs_to: :subgroup

  validates :user, presence: true
  validates :group, presence: true
  # Subgroup can be empty, as long as user as not been placed.

  # There should be only one participation per couple User:Group
  validates_uniqueness_of :group_id, :scope => [:user_id]

  # Also has a state-machine, describing the participation status.
end

说明:组被分成子组,用户选择他们加入的组,而不是由管理员稍后选择的子组。当用户被添加到组(group_a.users << user_a)时,ActiveRecord会自动创建一个参与。我希望当相同的用户被添加到该组的子组(具有subgroup_1group_a的子组的subgroup_1.users << user_a)时,相同的参与被重用。

实际发生的情况是ActiveRecord试图创建一个新的参与记录,这与之前创建的记录冲突(validates_uniqueness_of :group_id, :scope => [:user_id]会触发一个错误)。

有没有什么办法可以让我做这件事?我尝试连接before_validation、before_save和其他一些东西,但每次尝试都失败了。

也许有一种更好的方法来模拟这种关系?

欢迎任何帮助。

谢谢,

大卫

EN

回答 1

Stack Overflow用户

发布于 2013-12-04 12:40:42

您可以通过调用以下方法来耗尽所有代码

代码语言:javascript
运行
复制
class User < ActiveRecord::Base
  has_many :participations
  has_many :groups, through: :participations
  has_many :subgroups, through: :groups # HMT -> HMT
end

这能解决你的问题吗?这个可能不能扩展,但我们稍后会担心这个问题:)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20366194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档