ruby on rails“before_save”在父模型中检查子项的属性

时间:2014-07-17 20:39:55

标签: ruby ruby-on-rails-3

我有一个'place_detail'模型,它有很多孩子'电子邮件'

has_many :emails, :dependent => :destroy

并在电子邮件模型中:

belongs_to :place_detail

现在在place_detail中,我想添加一封电子邮件来检查attribut'has_email' 所以我补充说:

before_save :check_if_has_email
...
def check_if_has_email
  if emails.count >0
    self.has_email = true;
  else
    self.has_email = false;
  end
end
问题是,如果我创建了一个电子邮件子项,则属性has_email不会检查事件。我的理解是父母在>孩子之前

如何在创建儿童电子邮件时在place_detail中检查我的has_email?


编辑:  我可以简单地将has_email布尔值放在像

这样的方法中
def has_email?
  if self.emails.count >0
     return true
..

但是我更喜欢属性中的布尔值,因为我在很多范围内使用它,它会在应用程序中发生很大变化

2 个答案:

答案 0 :(得分:1)

这将确保您的模型至少有一封电子邮件(将其放入您的模型文件中place_detail.rb

has_many :emails, :dependent => :destroy
validates :emails, :length => { :minimum => 1 }

编辑:

一个建议就是在需要时检查特征place_detail.emails计数。如果你多次检查这样的数据,你可以像这样存储它

def has_email?
   (result ||= self.emails.count) > 0
end

这样它只会检查一次数据库

答案 1 :(得分:0)

如果您被迫使用' has_email' place_detail模型中的属性,您只需将place_detail保存在Email控制器的Create方法中。

@email = Email.new(email_params)
@email.place_detail.save