Ruby on rails 将用户限制为只有两个关联,而不是有许多广泛关联

Ruby on rails 将用户限制为只有两个关联,而不是有许多广泛关联,ruby-on-rails,Ruby On Rails,我希望我的应用程序中的每个用户都可以只添加两张图片,但只有一张是可见的,因此我在图片表中添加了一个名为“可见”的列: def change create_table :pictures do |t| t.string :picture t.boolean :visible, default: true t.timestamps end end 然后我需要像这样的东西: user has_two :pictures 最后我需要,如果他添加第二张图片,第

我希望我的应用程序中的每个用户都可以只添加两张图片,但只有一张是可见的,因此我在图片表中添加了一个名为“可见”的列:

def change
   create_table :pictures do |t|
     t.string :picture
     t.boolean :visible, default: true
     t.timestamps
   end
end
然后我需要像这样的东西:

user has_two :pictures
最后我需要,如果他添加第二张图片,第一张图片应该设置为visibile=false,新图片应该设置为visibile=true

当他尝试添加另一张图片(第3张)时,我应该用新图片替换具有
visible==true
的图片


这样做的方法是什么,以及如何实现(
has_two
)关联

我可以想出两种方法来处理这个问题

验证 两会 如果你确定每个人只需要两张照片,你可以选择一个更简单的解决方案,即“两个有一个关联”

class User
  has_one :visible_photo, class_name: 'Photo', -> { where visible: true }
  has_one :spare_photo, class_name: 'Photo', -> { where visible: false }

  def add_photo(details)
    self.create_spare_photo(...details...)
  end

  def activate_spare_photo
    visible_photo.deactivate if visible_photo
    spare_photo.activate if spare_photo
    # At this point, visible_photo will contain the earlier spare_photo
  end
end

class Photo
  def activate
    self.visible = true
    self.save!
  end

  def deactivate
   self.visible = false
   self.save!
  end
end

您好@RajeshKolappakam,谢谢您的回答,我喜欢第二个建议,但是如果我想操纵它,如何做,例如如果我想创建一张新照片,我应该做什么:user.build\u visible\u photo或user.build\u spare\u photo或什么?如何将其应用于我的案例是的,这些与任何其他
现在都有关联。所以你可以使用你提到的
build..
方法。我应该添加一些外键吗?或者仍然使用带有用户id外键的“我的照片”表,请在回答中添加更多详细信息以使其更清晰无需添加外键作为照片。用户id应仍然有效。为什么不试试看,如果你发现任何问题,请告诉我@depa的可能副本?我的问题本质上不是关于验证,而是关于如何操作两张图片,比如说,如果用户添加第一张图片,它将是他的个人资料照片,如果他添加第二张图片,第一张图片的“可见”列将设置为false(不可见)第二张图片将是他的新图片档案所有这些都在内部,用户不知道是否可以添加多少图片,所以不需要验证,用户知道的是他有可能添加一张图片
class User
  has_one :visible_photo, class_name: 'Photo', -> { where visible: true }
  has_one :spare_photo, class_name: 'Photo', -> { where visible: false }

  def add_photo(details)
    self.create_spare_photo(...details...)
  end

  def activate_spare_photo
    visible_photo.deactivate if visible_photo
    spare_photo.activate if spare_photo
    # At this point, visible_photo will contain the earlier spare_photo
  end
end

class Photo
  def activate
    self.visible = true
    self.save!
  end

  def deactivate
   self.visible = false
   self.save!
  end
end