将值重写为true并在rails中将其余值设置为false

时间:2009-11-11 04:49:05

标签: ruby-on-rails ruby validation

这是一个非常愚蠢的问题,但我有一个截止日期,我非常紧张,我已经尝试了一切。事实上,它甚至工作了一秒钟,但我必须打破一些东西。

我有一个默认的精选项目,我希望在我尝试使用其他项目时覆盖它。我以前给它一个错误,但我不希望它出错,我只是想把它设置为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

但由于命名的范围,它不会让我保存或进入无限循环或对我大喊

3 个答案:

答案 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

...确保始终存在默认设置,因此您不会遇到任何项目问题。