mysql - 如何使用 ActiveRecord 和 Ruby 从预先加载的表数组中删除数据库记录

标签 mysql ruby-on-rails ruby ruby-on-rails-4 activerecord

我们有一个包含帐户和患者表的用户表,它们都属于:user。我们急切地加载给定用户记录的帐户和患者表,如下所示:

user = User.includes([:accounts, :patients]).find_by(email: "testemail@here.com")

...这工作正常。如果我们想以 A) 将新记录提交到数据库和 B) 自动将新记录添加到急切加载数组的方式将记录添加到用户的帐户表中,我们执行以下操作:

user.accounts.create(:name => "test name", :customer => "test customer") 

...这也很好用。但是,我们如何销毁特定记录,以便 A) 从数据库中删除该记录,B) 自动从急切加载的数组中删除该记录?我们尝试简单地使用类似于:

account1 = user.accounts.first
account1.destroy

...这确实从数据库中删除了记录,但不会自动将其从急切加载的数组中删除。我们如何以这样的方式销毁一条记录,既将其从数据库中删除,又将其从急切加载的数组中删除?

最佳答案

你想要:

account1 = user.accounts.first
user.accounts.destroy(account1)

实际上,您急于加载关联对于您的问题或答案并不重要。重要的是user.accounts关联已经被加载(无论是通过急切加载还是普通的按需加载),并且您想要销毁其中一个对象,这样,就像您所说的那样,它既将其从数据库中删除,又将其从已加载的对象中删除内存中的关联。

您可以使用destroy来做到这一点任何多关联都有的方法。

这个destroy Rails Guide 中简要总结了任何 has-many 关联上的方法以及任何 has-many 关联上可用的其他方法。 ,并在 API docs for the has_many association 中了解更多详细信息。 。

user.accounts.destroy有点类似于 user.accounts.create你已经知道了。

另一个有用的是 <<多关联上的方法,类似于 create但已经存在 Account对象而不是像 create 这样的属性散列。

account = Account.new(:name => "test name", :customer => "test customer") 
user.accounts << account

...这两者都会创建新的帐户对象并将其添加到内存中 user.accounts协会。

还有一些其他有用的方法可用于任何 has-many 关联,以及与 belongs_to 一起使用的稍微不同的有用方法集。或has_one等等。值得查看上面链接的文档,看看有什么可用的。 (有时我会忘记其中的一些,或者记得它们存在但忘记了方法签名并且必须查找它)。

关于mysql - 如何使用 ActiveRecord 和 Ruby 从预先加载的表数组中删除数据库记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36904760/

相关文章:

mysql - 如何在数据库(Xml、Json)中存储键值对或一对多用户设置?

mysql - 如何编写查询来获取新捐赠者、第二年捐赠者……?

ruby-on-rails - 如何禁用扩展 HTTParty 的 gem 中的日志记录?

javascript - 带有客户端 haml 的 angularjs

ruby-on-rails - 设计:删除确认

ruby-on-rails - Rails - 附加属性并添加到数组

php - 不会查询程序的更新部分

mysql - #2006 MySQL 服务器在 Wamp 中消失了错误

ruby - Ruby statsample "mode"函数正确吗?

ruby-on-rails - Rails 中的 Where 子句和模型函数