我正在尝试验证Rails中的两个模型。

解雇的条件为“如果您的解雇类型为” Bowling”,那么您必须具有” BowlingRecord”。

class Dismissal < ActiveRecord::Base

  include DismissalHelper

  belongs_to :bowling_record

  validate :dismissal_bowling_record_combo_is_appropriate

  def dismissal_bowling_record_combo_is_appropriate
    return if !dismissal_type.present?
    if bowling_record.present?
      return if DismissalHelper::BOWLING_DISMISSAL_TYPES.include?(dismissal_type)
      errors.add(:dismissal_type, "#{dismissal_type} can't have a bowler!")
    else
      return if !DismissalHelper::BOWLING_DISMISSAL_TYPES.include?(dismissal_type)
      errors.add(:dismissal_type, "#{dismissal_type} must have a bowler!")
    end
  end

end

BowlingRecord的条件是:“如果您有一些解雇,那么他们必须是某种解雇类型”(其中bowled是其中之一)。

class BowlingRecord < ActiveRecord::Base

  include DismissalHelper

  has_many :dismissals

  validate :dismissals_go_against_bowler

  def dismissals_go_against_bowler
    dismissals.each do |dismissal|
      if !DismissalHelper::BOWLING_DISMISSAL_TYPES.include?(dismissal.dismissal_type)
        errors.add(:dismissal, "can't be #{dismissal.dismissal_type} if registered against a bowler") 
      end
    end
  end

end

我在构造它时遇到了麻烦,实际上我想做些类似的事情:

BowlingRecord.create!(
  extra_balls: 5,
  maidens: 3,
  runs: 56,
  dismissals: [ Dismissal.create!(dismissal_type: :bowled) ]
)

但这很夸张,因为在我们提出解雇时,它很正确地说:“如果您想让您的类型打保龄球,我需要保龄球记录”。 但是所有信息都在这里,我希望“解雇”的创建是懒惰的,因此它具有创建属于保龄球记录的上下文。

当然,我说要先创建保龄球记录,然后逐个添加解雇记录。 但这似乎是肮脏的代码,所以我想知道是否有任何方式可以这样做……

谢谢

===============>>#1 票数:1 已采纳

您可以.build相关的解雇:

record = BowlingRecord.new(
  extra_balls: 5,
  maidens: 3,
  runs: 56
)

record.dismissals.build dismissal_type: :bowled

record.save!

.build

返回一个集合类型的新对象,该对象已使用属性实例化并链接到该对象,但尚未保存。

有关更多信息,请参见ActiveRecord :: Associations :: CollectionProxy

通过ActiveRecord :: AutosaveAssociation ,在保存父BowlingRecord时自动保存解雇。 这是在事务内发生的,因此,如果两者之一无法保存,您就不会陷入不一致的状态。

  ask by Imran translate from so

未解决问题?本站智能推荐:

5回复

我如何获得一个模型的关系,该模型属于rails中的另一个模型

我有两个模型: Option和Answer 。 一个选项has_many :answers和一个答案belongs_to :option 。 我有一个名为@answers的变量: 现在,我需要与所有与@answers相关的选项建立联系。 我努力了: 但这会返回答案数组,而不
2回复

可能不允许删除模型,但允许将其作为Rails / ActiveRecord中的依赖项销毁吗?

由于依赖性问题,我无法销毁特定​​对象a 。 以破坏它的方式是通过破坏一个不同的对象b具有dependent: :destroy其belongs_to关联a : 有没有办法指定不允许删除a ,但是在删除b时仍然允许删除它? 我可以把它放在A : 但是A不会作为B的依赖项被
1回复

Rails 4中使用<<语法的ActiveRecord唯一性验证和孤立的has_many关联

我在一个简单的has_many关联上的validates_uniqueness_of遇到了一个奇怪的问题。 这是模型的简化版本: #profile.rb #major.rb 当我从Rails控制台添加关联时,会出现奇怪的行为: 第一个按预期方式添加。 然后我再次
1回复

如果尚未在Rails中进行预约,则将患者添加到医师模型中4

考虑以下模型: 目的 : 如果尚不存在,请创建一个患者。 将患者添加到特定医师(如果尚不存在) 我想,我可以用两种方法做到这一点: 方法1 方法二 现在,从以上两种方法中选择哪一种更好? 此外,在性能方面,还有没有比上一年更好的方法了?
1回复

rails-继承类属于另一个模型

我正在制作一个应用程序,其中将包含两种不同类型的产品-默认和用户定义。 我正在尝试仅将UserProducts与用户相关联,而DefaultProduct不需要此字段。 我已经上网了一段时间,但没有发现任何结论。 到目前为止,这是我尝试过的尝试: 我怀疑使用STI是造成此问题的
2回复

如何在Rails活动记录验证中本地化自定义错误消息?

具体来说,我试图在此处本地化“ 定制方法”示例。 我发现了一个类似的问题,但我不知道如何在errors.add()方法中传递:message参数。 我试图做这样的事情: 但它打印: 而不是打印.yml文件中的实际错误消息。 这里正确的语法应该是什么? 我的.yml
1回复

Rails 4活动记录验证 - 有条件地验证4个属性的相互依赖性存在

我有一个包含10个属性的表单。 其中我有4个属性,我需要应用我所谓的“互为条件存在”Active Record验证。 这些属性是 地址第一行 邮政编码 州 国家 这意味着如果用户填写其中一个,那么所有其他人必须在场 到目前为止,我只能说,如
1回复

在Rails中查找条件

我正在做一个项目,用户可以在此项目中创建座位有限的活动,并注册和参加其他活动。 到目前为止,我有一个事件,用户和座位模型。 并删除了用户在我的Seat模型中创建重复座位的功能。 当前,我有一个列出所有可用事件的页面。 我想做的是创建一个查询用户正在参加的所有事件,并将其从页面中
3回复

Rails:共同验证两列的唯一性

我有一个带有medium列和country列的Release模型(以及其他)。 不应有共享相同medium / country组合的releases 。 我将如何编写它作为Rails验证?
1回复

确保在保存和创建主模型后创建或保存关联Rails 4

我有这两个模型如下 在我的application_controller中,每当我创建一个新的Application记录时,也会在Commitment中创建一条新记录,它会尝试从应用程序记录中获取case_code,但是还没有执行应用程序模型的after_create方法。 有没有办