我很好奇是否有其他方法可以实现以下目标。
设定:
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
答案 0 :(得分:0)
我认为问题在于:
f = c2.features.find_or_create_by(name: "Wifi")
您正尝试在与c2相关联的功能中查找或创建功能。这就是它失败的原因,所以不,我不认为有这么好的方法,因为你想添加一个现有的功能。