佳华科技:4月20日融资买入387.8万元,融资融券余额5107.98万元|滚动
4月20日,佳华科技(688051)融资买入387 8万元,融资偿还632 1万元,融资净卖出244 3万元,融资余额5107 98万元,近20个交易日中有12个交易日
在 Rails 中,回调(Callbacks)是一种在模型对象的生命周期中执行特定代码的机制。回调可以在模型对象的创建、更新、删除等操作中执行特定的代码,例如保存对象前执行某些逻辑,或者在对象被删除前执行清理操作。
Rails 中的回调分为两种类型:前置回调(before callbacks)和后置回调(after callbacks)。前置回调在操作执行之前执行,后置回调在操作执行之后执行。可以使用 before_
和 after_
前缀来指定回调的类型。
(相关资料图)
以下是一些常见的回调类型:
before_validation
和 after_validation
:在验证对象之前和之后执行回调。before_save
和 after_save
:在保存对象之前和之后执行回调。before_create
和 after_create
:在创建对象之前和之后执行回调。before_update
和 after_update
:在更新对象之前和之后执行回调。before_destroy
和 after_destroy
:在删除对象之前和之后执行回调。要注册回调,可以在模型类中使用 before_
或 after_
前缀来指定回调的类型,然后指定要执行的方法:
class User < ApplicationRecord before_save :normalize_email private def normalize_email self.email = email.downcase endend
在上面的例子中,我们将 normalize_email
方法注册为 before_save
回调。这意味着在保存 User
对象之前,Rails 将自动调用 normalize_email
方法。在 normalize_email
方法中,我们将 email 属性转换为小写字母,以确保所有邮件地址都是小写的。
需要注意的是,注册回调时必须指定要执行的方法的名称,可以是一个实例方法或一个类方法。回调方法中可以使用模型对象的任何属性或方法来执行特定的逻辑,例如更新其他对象、发送电子邮件等。
使用回调可以让我们更灵活地控制模型对象的行为,可以在对象的生命周期中执行任意的操作。同时,回调也可以提高代码的可读性和可维护性,使代码更易于理解和修改。
Available Callbacks在 Rails 中,可以注册多种类型的回调来在模型对象的生命周期中执行特定代码。以下是可用的回调类型:
创建和保存对象before_validation
:在验证对象之前执行回调。after_validation
:在验证对象之后执行回调。before_save
:在保存对象之前执行回调,包括新建和更新操作。around_save
:在保存对象之前和之后执行回调,使用 yield
方法来执行保存操作。after_save
:在保存对象之后执行回调,包括新建和更新操作。before_create
:在创建对象之前执行回调。around_create
:在创建对象之前和之后执行回调,使用 yield
方法来执行创建操作。after_create
:在创建对象之后执行回调。更新和删除对象before_update
:在更新对象之前执行回调。around_update
:在更新对象之前和之后执行回调,使用 yield
方法来执行更新操作。after_update
:在更新对象之后执行回调。before_destroy
:在删除对象之前执行回调。around_destroy
:在删除对象之前和之后执行回调,使用 yield
方法来执行删除操作。after_destroy
:在删除对象之后执行回调。关联对象before_add_association
:在添加关联对象之前执行回调。after_add_association
:在添加关联对象之后执行回调。before_remove_association
:在删除关联对象之前执行回调。after_remove_association
:在删除关联对象之后执行回调。其他after_initialize
:在实例化对象之后执行回调。after_find
:在从数据库中查找对象之后执行回调。要注册回调,可以在模型类中使用相应的回调方法来指定回调的类型,然后指定要执行的方法。例如,要在保存对象之前执行特定的逻辑,可以使用 before_save
方法:
class User < ApplicationRecord before_save :normalize_email private def normalize_email self.email = email.downcase endend
在上面的例子中,我们将 normalize_email
方法注册为 before_save
回调。这意味着在保存 User
对象之前,Rails 将自动调用 normalize_email
方法。在 normalize_email
方法中,我们将 email 属性转换为小写字母,以确保所有邮件地址都是小写的。
需要注意的是,回调方法中可以使用模型对象的任何属性或方法来执行特定的逻辑,例如更新其他对象、发送电子邮件等。使用回调可以让我们更灵活地控制模型对象的行为,可以在对象的生命周期中执行任意的操作。同时,回调也可以提高代码的可读性和可维护性,使代码更易于理解和修改。
回调前更新属性会怎么办如果在回调中尝试更新属性,可能会导致一些问题。因为回调的执行顺序是不确定的,所以在某些情况下,属性的更新可能会被其他回调覆盖或被数据库中的持久化数据覆盖。
例如,如果我们在 before_save
回调中尝试更新某个属性,而在 after_save
回调中有另一个回调也尝试更新同一个属性,那么最终属性值可能会是不确定的,因为最后执行的回调会覆盖之前的值。
为了避免这种情况,应该尽量避免在回调中更新属性。如果确实需要更新属性,可以使用 update_column
方法来更新属性,该方法可以直接将属性更新到数据库中,而不触发其他回调。但是需要注意,使用 update_column
方法将跳过所有的验证,包括模型定义的验证,因此需要谨慎使用。
另外,如果在回调中需要使用其他模型对象的数据,可以将逻辑移动到控制器或服务对象中,以确保数据正确性和可维护性。
after_initialize and after_findafter_initialize
和 after_find
都是 ActiveRecord 模型中的回调方法。
after_initialize
方法会在创建新的 ActiveRecord 对象或从数据库中加载现有对象时被调用。该方法可以用来执行任意初始化逻辑,例如设置默认值或初始化关联对象。与其他回调不同,after_initialize
方法不需要接收任何参数,因为它是在对象创建之后立即调用的。
以下是一个示例,演示如何使用 after_initialize
方法在创建新对象时设置默认值:
class User < ApplicationRecord after_initialize :set_defaults private def set_defaults self.status ||= "active" endend
在上面的例子中,我们将 set_defaults
方法注册为 after_initialize
回调。在 set_defaults
方法中,我们检查 status
属性是否为 nil
,如果是,则将其设置为默认值 "active"
。
after_find
方法会在从数据库中查找 ActiveRecord 对象之后被调用。该方法可以用来执行任意的后处理逻辑,例如计算属性或更新关联对象。after_find
方法接收一个参数,即从数据库中加载的 ActiveRecord 对象。
以下是一个示例,演示如何使用 after_find
方法计算用户的年龄:
class User < ApplicationRecord after_find :calculate_age private def calculate_age self.age = Date.today.year - birthday.year endend
在上面的例子中,我们将 calculate_age
方法注册为 after_find
回调。在 calculate_age
方法中,我们使用从数据库中加载的用户对象的生日属性计算用户的年龄,并将结果保存到年龄属性中。
需要注意的是,after_find
方法只会在从数据库中加载对象时被调用,而不会在实例化新对象时被调用。如果需要在对象创建后执行某些逻辑,应该使用 after_initialize
方法。
after_touch
是Rails中的一个回调方法,它会在一个已关联的对象被touch操作更新后被触发。在Rails中,touch操作指的是在更新一个对象时,同时更新关联对象的更新时间戳(updated_at
)字段。这个操作可以用来实现缓存失效、重新计算统计数据等功能。
例如,假设你有一个User
模型和一个Post
模型,一个用户可以拥有多篇文章。当你更新某篇文章时,你可能需要更新相关用户的更新时间戳,以便在用户列表或其他地方正确地排序。你可以使用touch
选项来实现这一点,如下所示:
class Post < ApplicationRecord belongs_to :user, touch: trueendclass User < ApplicationRecord has_many :posts after_touch :update_sorting def update_sorting # 更新用户排序,例如更新`updated_at`字段 self.touch endend
这段代码定义了两个Active Record模型,Post
和User
,它们之间存在一个一对多的关联关系。
在Post
模型中,使用belongs_to :user, touch: true
声明了一个属于关联,表示一篇文章属于一个用户。touch: true
选项表示当文章被更新时,自动更新与之关联的用户的updated_at
字段,以便在用户列表或其他地方正确地排序。
在User
模型中,使用has_many :posts
声明了一个拥有多个关联,表示一个用户可以拥有多篇文章。after_touch :update_sorting
声明了一个after_touch
回调方法,表示当与之关联的一篇文章被touch操作更新时,自动调用update_sorting
方法更新用户排序,例如更新updated_at
字段。
在update_sorting
方法中,使用self.touch
方法更新用户的updated_at
字段,以便在用户列表或其他地方正确地排序。
需要注意的是,这段代码中使用了touch操作来实现自动更新关联对象的更新时间戳,这可以用来实现缓存失效、重新计算统计数据等功能。在Rails中,touch操作是一种常见的技巧,可以用来简化代码并提高性能。
需要注意的是,after_touch
回调方法只会在touch操作触发更新时被调用。如果你手动更新了updated_at
字段,after_touch
回调方法不会被调用。
这些是Rails中常用的Active Record模型操作方法,下面分别介绍它们的作用:
create(attributes = {})
:创建一个新的模型对象并将其保存到数据库中。可以传入一个哈希表参数attributes
表示要创建的模型对象的属性值。
create!(attributes = {})
:与create
相同,但如果保存失败会抛出异常。
destroy
:从数据库中删除当前模型对象。
destroy!
:与destroy
相同,但如果删除失败会抛出异常。
destroy_all
:删除符合条件的所有模型对象,不进行任何回调和验证。
destroy_by(conditions)
:根据条件删除符合条件的单个模型对象,不进行任何回调和验证。
save
:将当前模型对象的属性值保存到数据库中。如果对象不存在,则创建一个新的对象。
save!
:与save
相同,但如果保存失败会抛出异常。
save(validate: false)
:与save
相同,但不进行模型对象的验证。
toggle!
:将当前模型对象的布尔类型属性取反并保存到数据库中。
touch
:更新当前模型对象的updated_at
字段,并保存到数据库中。这个方法通常用于更新缓存或触发回调方法。
update_attribute(name, value)
:更新当前模型对象的单个属性值,并直接保存到数据库中,不进行任何验证。
update(attributes)
:更新当前模型对象的属性值,并保存到数据库中。可以传入一个哈希表参数attributes
表示要更新的属性值。
update!(attributes)
:与update
相同,但如果更新失败会抛出异常。
valid?
:检查当前模型对象是否通过验证。如果验证失败,可以使用errors
方法查看错误信息。
这些方法是Rails中常用的Active Record模型操作方法,可以用于创建、更新、删除和验证模型对象。需要注意的是,这些方法中有些会触发回调方法、进行验证或抛出异常,具体使用时需要根据实际情况选择合适的方法。
关键词:
4月20日,佳华科技(688051)融资买入387 8万元,融资偿还632 1万元,融资净卖出244 3万元,融资余额5107 98万元,近20个交易日中有12个交易日
婚事简办文明新风入人心(深阅读·关注婚俗改革),婚俗,彩礼,红白事,村规,婚嫁,陋习
封面新闻记者熊英英又一家A股公司因涉嫌欺诈发行被拉响强制退市警报!4月19日,*ST奇信收到证监会下发的《行政处罚及市
1、广州做牙齿整形最好的医院是哪家?只要是正规的三甲医院做牙齿整形都是最好的。2、一口既整齐又洁白的牙齿是生活中每个爱美
遭遇合同诈骗华脉科技一口气修订五份年报,林洋,年报,华讯,通信,中国电信,合同诈骗,华脉科技
为加强全省少先队员劳动教育,积极推动全省少先队员参与家务劳动,2023年,共青团江苏省委、江苏省少工委联合交汇点新闻,在
1、很好的,值得买。2、优势主要体现在以下方面:外形够大昂科威看着像是一台全尺寸SUV了,而国产途观就是加长后看着还像一
(永州市代表队比赛现场。王杨摄)华声在线4月19日讯(记者赖泳源)4月19日下午,在湖南省第十届少数民族传统体育运动
北京时间4月20日消息,2023赛季中超联赛第二轮比赛展开争夺,武汉三镇坐镇主场迎来了北京国安的挑战,在比赛中,武汉三镇门将刘殿座的一次低
游戏版号继续如期发放。4月20日,国家新闻出版署发布4月国产网络游戏审批信息,共86款游戏获批。澎湃新闻记者查询发现,包括哔哩哔哩(Nasdaq:
为深入贯彻落实党的二十大精神和中央经济工作会议提出的“落实落细就业优先政策,把促进青年特别是高校毕业生就业工作摆在更加突出的位置”的
4月19日江西省红十字会消息,经过国际护士会与佛罗伦萨南丁格尔国际基金会理事会评选,南昌市第一医院护理部原主任、第39届南丁格尔奖章获得
由省委宣传部、省委政法委主办,我台承办的《第三届“青海榜样”宣传发布》节目将于今晚7点35分在青海卫视播出,敬请收看。
据@广东天气消息,预计19日至21日广东大部雷雨天气频繁,并伴有8级至10级雷雨大风、短时强降水和小冰雹等强对流天气。1
大家好,小乐来为大家解答以上的问题。封阳台有哪几种封法不算违建,封阳台有哪几种封法这个很多人还不知道,现在让我们一起来看看吧!1、因
Copyright 2015-2022 亚洲双创网 版权所有 备案号:豫ICP备20022870号-9 联系邮箱:553 138 779@qq.com
生活知识 季风是怎么形成的
由海陆热力差异和气压带风带季节移动共同引起。海陆热力差异表现为:冬季大陆降温幅度强与相邻的海洋,使得大陆近地面形成冷高压而海洋近地
随着全光网络越织越密 如何进一步增强消费者和产业界的“获得感”?
近年来,在5G和宽带双千兆牵引下,新项目、新试点、新应用层出不穷。随着全光网络越织越密,如何进一步增强消费者和产业界的获得感?湖北日
致敬老将!热爱可抵岁月漫长
<script src="http: tv people com cn img player v js">< script><script>showPlayer({id:" pvservice xml 202