限制用户只有两个关联,而不是广泛关联has_many

时间:2013-09-30 02:01:15

标签: ruby-on-rails

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

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,新图片应设置为visible = true。

当他尝试添加另一张图片(第3张)时,我应该用新的

替换visibile == true的图片

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

1 个答案:

答案 0 :(得分:0)

我可以想到两种方法来处理这个

验证

class User
  MAX_PHOTOS_PER_PERSON = 2
  has_many :photos
  validate_on_create :photos_count_within_bounds

  def visible_photo
    photos.find(&:visible)
  end

  private

  def photos_count_within_bounds
    return if photos.blank?
    errors.add("Only #{MAX_PHOTOS_PER_PERSON} photos allowed per person") if photos.length > MAX_PHOTOS_PER_PERSON 
  end
end

class Photo
  belongs_to :album
  validates_associated :album
end

两个关联

如果您确定每人只需要两张照片,那么您可以找到两个has_one关联的更简单的解决方案

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