![](/img/trans.png)
[英]Setting value in database as False dependent on a different value else 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.