2011-07-29 37 views
1

我是Ruby新手,所以请原谅,如果这些是完全无知。我想设置如下关联:在Rails中设置模型关联 - 从孙子方保存'

  • 转录属于组成
  • 成分有很多改编,属于艺术家
  • 艺术家有很多成分(和改编通过组成)

我不不想有任何创作作品和艺术家的独立形式。用户只需创建转录 - 转录的形式具有艺术家和作品的文本字段,数据库条目应该动态创建(如果它们不存在的话)。

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

# 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_or_create_by_name组成?

任何帮助表示赞赏!在此先感谢

回答

1

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

我累了,也许乱七八糟的东西了,但在这里,我们去(未测试):

# 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 
+0

感谢了很多!你的代码几乎是完美的,并引导我去做什么似乎工作。我遇到了attr_reader和我的表单问题(他们在构图和艺术家未初始化时失败)。我已经写了这样的东西(可以做得更好吗?)http://pastebin.com/7WvCaDBZ 我也改变了保存到这,因为我想总是有独特的艺术家和作曲对:http: //pastebin.com/ZapzvBF5 – chodorowicz

+0

更好的方法是不使用composition_name或artist_name。只需访问transcription.composition.artist.name和transcription.composition.name。阅读“嵌套表单”,我相信你会得到一些好的想法。 http://guides.rubyonrails.org/2_3_release_notes.html#nested-object-forms如果在rails中有些东西看起来很尴尬,那么很可能有更好的方法。 –

+0

再次感谢我的指导。我可能会留下当前的解决方案,因为几乎所有嵌套窗体的例子都是当窗体中有子模型的时候。我有相反的方向(belongs_to是主要模型)。我发现了几个例子,当belongs_to模型是形式的主要模型,但我没有找到任何与两级深层关联的例子,因为我有。这可能会变得复杂...... – chodorowicz