Ruby on rails 从模型内部获取未保存的关联

Ruby on rails 从模型内部获取未保存的关联,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,如何从模型方法内部访问未保存的关联?例如: class Post < ActiveRecord::Base has_many :comments def comment_dates comments.pluck(:created_at).sort end end class Post

如何从模型方法内部访问未保存的关联?例如:

class Post < ActiveRecord::Base
  has_many :comments

  def comment_dates
    comments.pluck(:created_at).sort
  end
end
class Post
在模型方法中调用的
comments
方法返回刚刚保存的关联。当我从对象调用该方法时,例如,
post.comments
,它会返回已保存和未保存的关联


如何从模型方法内部访问已保存和未保存的关联?我需要这个来做一些复杂的验证,包括关联。

像这样的东西怎么样

class Post < ActiveRecord::Base
  has_many :comments

  def comment_dates
    comments.pluck(:created_at).sort
  end

  def comments_dates_no_query
    comments.map(&:created_at).sort
  end

  def unsaved_comments
    comments.reject(&:persisted?)
  end

  def saved_comments
    comments.select(&:persisted?)
  end
end


希望有帮助

你确定comments.reject(&:persistend?)会返回任何东西吗?@ppascualv-是的,快速谷歌搜索会显示其他用例:。希望这能证明它是有效的!不过,如果我遗漏了什么,请告诉我!根据我的经验,如果Post模型没有被持久化,那么通过#comments方法无法获得未持久化的关联成员。我发现您只能通过使用诸如comments.to_a或comments.find之类的数组方法来访问它们。这救了我的命。对此我感激不尽:实际上并不是评论返回,而是持续的评论。当我调用任何涉及数据库的方法时,例如
pull
,它会忽略未持久化的注释。所以我必须避免使用ActiveRecord方法来处理这些对象。我不太清楚“忽略未持久化的注释”是什么意思。如果在
处创建的模型(
Comment
在您的示例中)应该是空的(好吧,它没有持久化,所以没有创建日期)。当您的模型中有
comments.pulk(:created_at).sort时,它实际上执行查询,但您可以将其替换为
comments.map(&:created_at).sort
以便对当前
Comment
对象进行操作。如果这是你需要的,我会更新答案!
post.saved_comments
post.unsaved_comments