2009-11-11 40 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

相關問題