我有一个Ruby on Rails应用程序,它使用rails_admin(https://github.com/sferik/rails_admin)作为后端。
我有一个名为banner的模型,所以数据库中的表名为banners。管理员可以尽可能多地创建横幅,也可以删除它们。但我想修复3中的横幅数量。我希望有3个横幅(已经创建),我希望管理员无法创建或销毁任何横幅。
有人可以帮助我吗?
谢谢!
答案 0 :(得分:0)
class Thing < ActiveRecord::Base
has_many :banners
end
应用程序/控制器/ things_controller.rb
def create
@thing = Thing.new
@thing.banners << Banner.new(:name=>'Banner 1',....)
@thing.banners << Banner.new(:name=>'Banner 2',....)
@thing.banners << Banner.new(:name=>'Banner 3',....)
@thing.save
end
现在只要你在别的地方打电话给@ thing.banners&lt;&lt; ,你可以保证任何东西都会有三个横幅。
答案 1 :(得分:0)
救援的验证:
class Thing < Active Record::Base
has_many :banners
validate :banner_count
private
def banner_count
errors.add(:base, "Banner count must be 3") unless self.banners.count == 3
end
end
答案 2 :(得分:0)
@RadBrad指出,您可以在代表三个横幅的另一个模型上使用has_many
。也许可以称之为BannerSet或类似。您可以像他说的那样一次创建三个,或者在BannerSet验证中,您可以确保只关联了3个横幅。
您还可以在BannerSet模型上拥有3个属性(列),这些属性具有横幅的3个ID。如果你确定它总是3个横幅,那么这也可能是一个很好的设计。
但是,如果你只有一个控制器用于横幅广告,这就是你如何做到的,这不是最好的方式,正如你所看到的那样。
首先,您可以在控制器中使用declarative authorization:
authorization do
has_permission_on :banners, :to => [:new, :create] do
Banner.count < 3
end
end
要确保即使在您进入创建屏幕后添加横幅广告时仍无法添加横幅,也请为横幅模型添加验证:
before_create :validate_max_banners
def validate_max_banners
errors.add_to_base("Only 3 banners are allowed.") if Banner.count == 3
errors.empty?
end
两者都不能完全确保您在该表中只能有3行。要做到这一点,您需要在数据库端使用触发器或类似功能,如this q&a中所述。但是,对于一个基本的解决方案,这可能没问题。
请注意,即使可以轻松配置和自定义RailsAdmin(请参阅其wiki了解文档),如果您需要更多自定义,我还会考虑使用ActiveAdmin