这是一个非常愚蠢的问题,但我有一个截止日期,我非常紧张,我已经尝试了一切。事实上,它甚至工作了一秒钟,但我必须打破一些东西。
我有一个默认的精选项目,我希望在我尝试使用其他项目时覆盖它。我以前给它一个错误,但我不希望它出错,我只是想把它设置为false,这个应用程序为true。
我在保存之前尝试了所有内容,保存/更新命名范围后,将每个范围映射为false然后保存,检查功能是否已更改...我认为我有所有正确的部分但我可以'把它们放在一起。请帮助:(
也许甚至会对此进行快速验证,我不确定
我无法详细说明代码,因为我尝试过一百万种不同的东西。
项目上有一个名为is_featured的布尔设置。
创建项目时,您可以将其设置为是否具有特色。
在数据库中,如果其他项目具有特色,则应将这些项目清零,并且刚刚更新或创建的项目应为true。
我在模型中使用之前/之后/保存/更新以及创建和更新的控制器
很好我会添加一些我不知道为什么不起作用的愚蠢代码
在控制器中:
if params[:app][:is_on_front_page] == true
App.all.map{|m|( m != @app ) ? m.is_on_front_page = true : m.is_on_front_page = false}
端
或
named_scope :is_on_front_page, :conditions => { :is_on_front_page => true }
after_update do
if self.is_on_front_page.changed? and App.is_on_front_page.count >= 1
App.all.map{|m| m.is_on_front_page = false;m.save}
end
is_on_front_page = true
save!
end
但由于命名的范围,它不会让我保存或进入无限循环或对我大喊
答案 0 :(得分:1)
if params[:id] # or however you're setting the overridden featured item
@feature = Feature.find(params[:id])
else
@feature = Feature.default # make a self.default method that returns the default
end
这就是你需要的吗?选择特色商品?
我不确定你需要什么。验证将用于保存某些内容,因此我不确定那里会有什么“特色”。澄清的评论会有所帮助。
如果没有提供某些东西,那么你可以设置一个before_create或before_update钩子,但除此之外我还需要一些关于你的细节的指导。
答案 1 :(得分:1)
在事务中将all设置为false,然后更新您想要的记录(特征)。这类似于有时它更容易删除记录然后找到它们并更新它们。也就是说,它更容易做类似的事情:
是的 SomeModel.delete_all items.each {| i | SomeModel.create(i)} 端然后在SomeModel上循环执行find()然后更新某些属性会更容易。
在您的情况下,您只想将所有记录标记为NOT-featured,然后只更新您想要的那个记录,而不是手动切换记录。
尝试这样的事情:
after_create :set_as_featured
def set_as_featured
self.class.transaction do
self.connection.execute("UPDATE foo SET featured=0")
self.update_attribute(:featured, true)
end
end
答案 2 :(得分:0)
好的,我正在添加一个单独的答案,因为我认为我得到你所说的。
你有一个项目列表,你想要其中一个特色。有人可以选择其中一个进行推荐,但如果没有,会有一个后备项目默认显示。
如果你有Store has_many:items,你可以在商店中放置“featured_item_id”的属性并存储featured_id。如果您需要设置默认值,请添加“default_item_id”并将默认值放在那里。
在商店中为他们添加关系:
belongs_to :featured_item, :class => Item, :foreign_key => 'featured_item_id'
belongs_to :default_item, :class => Item, :foreign_key => 'default_item_id'
然后,制作一个测试并返回正确方法的方法:
def featured
if self.featured_item_id
self.featured_item
else
self.default_item
end
end
如果您将项目设置为特色项目,则会获得该项目。如果没有,您将获得默认值。你可能也想要:
validates_presence_of :default_item_id
...确保始终存在默认设置,因此您不会遇到任何项目问题。