2009-11-11 65 views
0

这是一个非常愚蠢的问题,但我有一个最后期限,我很紧张,我用尽了一切。事实上,它甚至有一秒钟的工作,但我必须打破一些东西。覆盖值设置为true,并在轨道其余设置为false

我有,我想重写任何时候,我尝试另一个功能项的默认的精选项目。我曾经给它一个错误,但我不希望它错误,我只是想要它将一切设置为false,并将此应用程序设置为true。

我用尽了一切办法,保存前,后保存命名范围/更新,映射每一个为false,然后保存,检查该功能是否发生了变化......我想我拥有所有正确的部分,但我可以把他们放在一起。请请帮助:(

也许有即使是在这个快速的验证,我不知道

,因为我已经尝试了一百万个不同的东西,我不能细说代码。

有在被称为is_featured一个项目一个布尔值设置。

当您创建项目,您可以将其设置为特色与否。

在数据库中,如果功能等物品,这些应该被清零,以及只是你的物品pdated或创建为特色应该是真实的。

我已经与模型试图在此之前/后/保存/更新,并在CONTROLER创建和更新

好啊,那我会增加一些我的愚蠢的代码标识on't知道为什么不工作

在控制器:

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

您需要提供一些细节。例如,项目的特点如何? – cgr 2009-11-11 05:13:46

+0

你能否详细说明一些代码? – Chirantan 2009-11-11 05:14:31

回答

1

在事务中,只需将所有设置为false,然后更新您想要的记录(精选)。这与有时更容易删除记录然后找到并更新它们相似。也就是说,它更容易做到这一点:

tranasction do 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 
+0

这就是我想要做的!它没有工作!看我的代码。我需要检查它在保存之后或之前是否发生了变化,然后清除所有内容并将curernt项目设置为true。我不知道它为什么不起作用 – 2009-11-11 05:34:40

+0

@stacia - 查看我的更新条目。基本上只需使用清除所有其他的回调,然后将新创建的记录设置为精选。 – 2009-11-11 05:55:59

+0

为什么不能工作? if @ app.is_on_front_page_changed? == true App.is_on_front_page.map {| m | m.is_on_front_page = false} 结束 – 2009-11-11 06:02:55

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钩会在那里,如果没有提供的东西,你会设置默认值,但除此之外,我需要一些指导,您的具体情况。

+0

说我有10个项目,我只想要一个功能。也许项目2已经有特色。当我去创建一个新项目时,我想要所有项目(实际上只是项目2,但现在有不止一个特色,所以我们会保留它)设置为FALSE,我创建的项目更改/更新为设置为true。那有意义吗? – 2009-11-11 05:16:11

+0

查看其他答案。我认为这是你的胡同。不过,我要把这件事留给后代。 – wesgarrison 2009-11-11 05:24:42

0

好吧,我加入一个单独的答案,因为我想我明白你在说什么。

你有一个物品清单,你想要其中一个特色。有人可以选择其中一个特色,但如果没有,则会有一个默认情况下具有特色的后备项目。

如果你有商店的has_many:物品,你可以把一个属性上的商店“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 

...确保总是有一个默认,所以你不会得到一个零项的问题。

+0

我想这会工作,但它似乎是矫枉过正。我只处理布尔。它要么是有特色的,要么没有。我只想要一个00000的列表,然后是一个特色的列表。把所有东西都归零,然后放置一个真实或一个我更新了这个的地方。 – 2009-11-11 05:27:05