在Rails中设置模型关联 - 从'孙子方面'保存

时间:2011-07-29 00:53:51

标签: ruby-on-rails belongs-to virtual-attribute

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

  • 转录属于Composition
  • 作文有很多转录,属于艺术家
  • 艺术家有许多作品(以及通过作曲的转录)

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

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

# 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 个答案:

答案 0 :(得分: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