我希望我的应用中的每个用户都可以添加两个图片,但只有一个是可见的,所以我在图片表中添加了一个名为“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
)关联
答案 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