Ruby on rails 在Rails中设置模型关联-保存';从孙子方';

Ruby on rails 在Rails中设置模型关联-保存';从孙子方';,ruby-on-rails,belongs-to,virtual-attribute,Ruby On Rails,Belongs To,Virtual Attribute,我是一个红宝石新手,所以如果其中一些是完全无知的,请原谅。我要设置以下关联: 转录属于合成 这篇作品有很多抄本,属于艺术家 艺术家有许多作品(以及通过作品进行的转录) 我不想有任何独立的形式来创作作品和艺术家。用户只需创建转录-转录表单具有文本字段,应动态创建合成和数据库条目(如果它们不存在) 我应该如何设置模型?我应该在转录中使用一些虚拟属性吗 # transcription.rb def artist_name artist.name if self.artist end def

我是一个红宝石新手,所以如果其中一些是完全无知的,请原谅。我要设置以下关联:

  • 转录属于合成
  • 这篇作品有很多抄本,属于艺术家
  • 艺术家有许多作品(以及通过作品进行的转录)
我不想有任何独立的形式来创作作品和艺术家。用户只需创建转录-转录表单具有文本字段,应动态创建合成和数据库条目(如果它们不存在)

我应该如何设置模型?我应该在转录中使用一些虚拟属性吗

# transcription.rb
def artist_name
  artist.name if self.artist
end

def artist_name=(name)
  self.artist = Artist.find_or_create_by_name(name) unless name.blank?
end 
然后使用我以前找到或创建的艺术家使用
find_或\u create_by_name
创建构图


感谢您的帮助!提前感谢

您不能在转录中设置艺术家,因为艺术家有许多作品而不是转录,您需要通过合成访问艺术家。我希望这段代码能更好地解释它

我很累,可能把事情搞砸了,但现在我们开始(未测试):


您不能在转录中设置艺术家,因为艺术家有许多作品而不是转录,您需要通过合成访问艺术家。我希望这段代码能更好地解释它

我很累,可能把事情搞砸了,但现在我们开始(未测试):


非常感谢!你的代码近乎完美,引导我找到了似乎有效的东西。我的attr_reader和表单有问题(当构图和艺术家未初始化时,它们会失败)。我写过这样的东西(能做得更好吗?)我也把保存改成了这样,因为我希望艺术家和构图总是独一无二的:更好的方法是根本不用构图名或艺术家名。只需访问transcription.composition.artist.name和transcription.composition.name。阅读“嵌套表单”,我相信你会有一些好主意。如果rails中出现了一些尴尬的事情,那么很可能有更好的方法来解决。再次感谢您的指导。我可能会暂时使用当前的解决方案,因为几乎所有嵌套表单的示例都是在表单中有子模型时使用的。我有它在相反的方向(属于你是主要模式)。我已经找到了几个例子,当English_to model是表单的主要模型时,但是我还没有找到任何像我这样具有两级深度关联的例子。这可能会变得复杂…非常感谢!你的代码近乎完美,引导我找到了似乎有效的东西。我的attr_reader和表单有问题(当构图和艺术家未初始化时,它们会失败)。我写过这样的东西(能做得更好吗?)我也把保存改成了这样,因为我希望艺术家和构图总是独一无二的:更好的方法是根本不用构图名或艺术家名。只需访问transcription.composition.artist.name和transcription.composition.name。阅读“嵌套表单”,我相信你会有一些好主意。如果rails中出现了一些尴尬的事情,那么很可能有更好的方法来解决。再次感谢您的指导。我可能会暂时使用当前的解决方案,因为几乎所有嵌套表单的示例都是在表单中有子模型时使用的。我有它在相反的方向(属于你是主要模式)。我已经找到了几个例子,当English_to model是表单的主要模型时,但是我还没有找到任何像我这样具有两级深度关联的例子。这可能会变得复杂。。。
# transcription.rb

attr_writer :composition_name, :artist_name
before_save :set_artist_and_composition
validates_presence_of :artist_name, :composition_name

def composition_name
  composition.name
end

def artist_name
  composition.artist.name
end

def set_artist_and_composition
  artist = Artist.find_or_create_by_name(@artist_name)
  self.composition = Composition.find_or_create_by_name(@composition_name)
  self.composition.artist = artist
end