繁体   English   中英

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

[英]overriding a value to true and setting the rest to false in rails

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

我有一个默认的特色项目,我想在每次尝试添加另一个项目时都将其覆盖。 我之前曾给出过错误,但我不希望它出错,我只是希望它将所有内容都设置为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

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

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钩子将是您设置默认值的地方,但是除此之外,我需要一些有关您的具体信息的指导。

在事务中,只需将all设置为false,然后将您想要的记录更新为true(功能)。 这类似于有时更容易删除记录然后找到它们并更新它们。 也就是说,只需执行以下操作即可:

进行SomeModel.delete_all items.each {| i | SomeModel.create(i)}结束

然后可以更简单地遍历SomeModel进行find()然后更新某些属性。

在您的情况下,您只想将所有记录标记为非功能记录,然后只更新想要的功能记录,而不是手动切换记录。

尝试这样的事情:

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

好的,我要添加一个单独的答案,因为我想我明白您的意思。

您有一个项目列表,并且想要其中一个功能。 有人可以选择其中之一,但如果没有,默认情况下会有一个后备项。

如果您拥有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

...以确保始终存在默认值,以免出现零项目问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM