find_or_create_by尝试使用hmt关联创建重复记录

时间:2017-02-09 09:24:49

标签: ruby-on-rails rails-activerecord

我很好奇是否有其他方法可以实现以下目标。

设定:

class Cabin < ApplicationRecord
  has_many :feature_groupings
  has_many :features, through: :feature_groupings
end

class Feature < ApplicationRecord
  has_many :feature_groupings, dependent: :destroy
  has_many :cabins, through: :feature_groupings

  validates_uniqueness_of :name
end

class FeatureGrouping < ApplicationRecord
  belongs_to :feature
  belongs_to :cabin
end

c1 = Cabin.create(name: "Standard")
c2 = Cabin.create(name: "Luxury")
c1.features.create(name: "Wifi")
f = c2.features.find_or_create_by(name: "Wifi")

这导致

2.4.0 :006 > f.errors.full_messages
 => ["Name has already been taken"]

是否有一种更简洁的方式将功能(id:1,名称:“Wifi”)与c2(id:2,名称:“Luxury”)相关联,而不仅仅是:

c2.features << Feature.find_or_create_by(name: "Wifi")

我原本以为使用HMT关联到find_or_create该功能会有某种铁轨魔法。

Rails版本:5.0.1

Ruby版本:2.4.0

1 个答案:

答案 0 :(得分:0)

我认为问题在于:

f = c2.features.find_or_create_by(name: "Wifi")

您正尝试在与c2相关联的功能中查找或创建功能。这就是它失败的原因,所以不,我不认为有这么好的方法,因为你想添加一个现有的功能。