如何仅引用活动记录关联中的持久记录

彼得·尼克西

在许多控制器的edit方法中,您可以初始化一个新对象并编辑现有对象

class MagazinesController < ApplicationController
   def edit
      @magazine = Magazine.find(params[:magazine_id])
      @page = Page.find(params[:id])
      @new_page = @magazine.pages.new
   end
end

但是,在视图中,您通常需要循环浏览持久化对象并分别对待新对象

# magazines#edit
%h4 Existing pages
- @magazine.pages.each do |page|
  %p= link_to page, page.title

问题

...是该pages关联既包含现有(持久)页面,又包含我们通过创建的新页面@new_page = @magazine.pages.new

这很容易处理,但是很难看

%h4 Existing pages
- @magazine.pages.each do |page|
  - if page.persisted?
    %p= link_to page, page.title

我想使用某种关联方法仅选择那些持久化的页面:

%h4 Existing pages
- @magazine.pages.persisted.each do |page|
  %p= link_to page, page.title

有什么办法吗?

彼得·尼克西

@ Florent2和@CDub的建议都是正确的。但是,@ florent2的建议意味着再次命中数据库(并可能放弃了我不想做的任何预设的紧急加载),而@CDub的建议在代码方面还不太可行。这就是我最终要进行的工作:

仅返回特定关联的持久记录

class Magazine < ActiveRecord::Base
  has_many :pages do 
    def persisted
      collect{ |page| page if page.persisted? }
    end
  end
end

这使您可以调用.persisted与Magazine关联的页面的任何ActiveRecord关系。它不会再次访问数据库,因为它只过滤了预加载的对象并返回保留的对象。

使代码可重用

由于我想定期重用此代码,因此可以将其拉入模块

module PersistedExtension
  def persisted
    select{|item| item if item.persisted?}
  end
end

然后可以使用lambda将其包含在关联方法中:

class Magazine < ActiveRecord::Base
  # ...
  has_many :pages, -> { extending PersistedExtension }

end

我可以直观地称呼它:

@magazine = Magazine.first

@magazine.pages.persisted
# => array of pages which are persisted

# the new persisted association extension works on any AR result set
@magazine.pages.order('page ASC').persisted

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用活动记录正确定义此关联?

来自分类Dev

如果当前模型中的方法名称相同,如何调用活动记录的关联方法

来自分类Dev

如何使用活动记录方法获取关联的关联集合(代理集合)

来自分类Dev

使用活动记录删除

来自分类Dev

仅包括最新/最新关联记录和活动记录?

来自分类Dev

如何使用活动记录批量处理each_cons

来自分类Dev

如何使用活动记录来获得朋友的朋友?

来自分类Dev

Rails仅迭代与对象关联的持久记录

来自分类Dev

调用活动记录对象时,如何根据某些条件返回不同的活动记录?

来自分类Dev

如何关联她和活动记录模型?

来自分类Dev

活动记录关联错误

来自分类Dev

使用Sitemaps生成器时,是否可以使用活动记录之类的关联?

来自分类Dev

使用活动记录保存时出错

来自分类Dev

仅检索关联的记录

来自分类Dev

Ruby on Rails 5,活动记录关联,仅 API

来自分类Dev

如何仅检索那些没有关联记录的记录?

来自分类Dev

如何使用活动记录在yii2中的一个交易中进行多个删除或更新或插入

来自分类Dev

如何仅基于活动记录中的“ updated_at”列检索更新的记录

来自分类Dev

如何在Rails中创建活动记录类的未持久实例?

来自分类Dev

在Rails中的持久记录

来自分类Dev

如何在Rails(活动记录)中定义多对多关联和相关属性?

来自分类Dev

如何取消整个rails活动记录关联链中特定模型的默认范围?

来自分类Dev

使用活动记录在mysql中设置数据类型

来自分类Dev

引用活动中的片段元素

来自分类Dev

删除关联后如何保存活动记录对象?

来自分类Dev

Rails活动记录关联:从多个表中获取数据

来自分类Dev

在Rails活动记录中创建丰富的多对多关联

来自分类Dev

如何更新关联记录

来自分类Dev

在Ruby on Rails中使用活动记录执行SQL操作

Related 相关文章

  1. 1

    如何使用活动记录正确定义此关联?

  2. 2

    如果当前模型中的方法名称相同,如何调用活动记录的关联方法

  3. 3

    如何使用活动记录方法获取关联的关联集合(代理集合)

  4. 4

    使用活动记录删除

  5. 5

    仅包括最新/最新关联记录和活动记录?

  6. 6

    如何使用活动记录批量处理each_cons

  7. 7

    如何使用活动记录来获得朋友的朋友?

  8. 8

    Rails仅迭代与对象关联的持久记录

  9. 9

    调用活动记录对象时,如何根据某些条件返回不同的活动记录?

  10. 10

    如何关联她和活动记录模型?

  11. 11

    活动记录关联错误

  12. 12

    使用Sitemaps生成器时,是否可以使用活动记录之类的关联?

  13. 13

    使用活动记录保存时出错

  14. 14

    仅检索关联的记录

  15. 15

    Ruby on Rails 5,活动记录关联,仅 API

  16. 16

    如何仅检索那些没有关联记录的记录?

  17. 17

    如何使用活动记录在yii2中的一个交易中进行多个删除或更新或插入

  18. 18

    如何仅基于活动记录中的“ updated_at”列检索更新的记录

  19. 19

    如何在Rails中创建活动记录类的未持久实例?

  20. 20

    在Rails中的持久记录

  21. 21

    如何在Rails(活动记录)中定义多对多关联和相关属性?

  22. 22

    如何取消整个rails活动记录关联链中特定模型的默认范围?

  23. 23

    使用活动记录在mysql中设置数据类型

  24. 24

    引用活动中的片段元素

  25. 25

    删除关联后如何保存活动记录对象?

  26. 26

    Rails活动记录关联:从多个表中获取数据

  27. 27

    在Rails活动记录中创建丰富的多对多关联

  28. 28

    如何更新关联记录

  29. 29

    在Ruby on Rails中使用活动记录执行SQL操作

热门标签

归档