【问题标题】:How to save data if you have two HABTM relations in a single model?如果单个模型中有两个 HABTM 关系,如何保存数据?
【发布时间】:2013-07-21 12:22:38
【问题描述】:

我共有三个模型:用户、专辑和流派。用户是指艺术家(歌手、作曲家、音乐家等)。一张专辑可以有许多艺术家(用户)和许多流派。一个艺术家可以为许多专辑作曲/唱歌。总之我有以下模型和控制器动作。 我在 db 中创建了两个 HABTM 关系:albums_genres 和 users_albums。

//User model
class User < ActiveRecord::Base
   has_and_belongs_to_many :albums
end

//Album model
class Album < ActiveRecord::Base
   has_and_belongs_to_many :genres
   has_and_belongs_to_many :users
end

//Genre model
 class Genre < ActiveRecord::Base
    has_and_belongs_to_many :albums
 end

//albumController create method
def create
  @user = current_user
  @album = @user.albums.new(params[:album])
  if @album.save
     ...
  end
end

当我按如下方式发送数据时,数据会正确插入到相册_用户中。

"Album"=>{"title"=>"Test album", "description"=>"test description"

但是,我也想将数据插入到 albums_genres 表中。为此,我的参数数据如下所示:

"Album"=>{"title"=>"Test album", "description"=>"test description", "genre_ids"=>["1", "2", "3"]}

然后我收到一个错误无法批量分配受保护的属性:genre_ids。它试图将数据插入到专辑表中,我认为应该将genre_ids 插入到相册_genres 中。所以我的问题是我需要如何编写控制器代码?编写控制器和/或模型代码的更好方法受到高度赞赏。先感谢您!参考摘自:http://railscasts.com/episodes/17-habtm-checkboxes

【问题讨论】:

  • 第一个参数数据粘贴错误?我看不到对用户的引用。
  • 有:@user = current_user。当我写成@album = current_user.albums.new(params[:album]) 时它不起作用。所以我不得不这样改变。

标签: ruby-on-rails ruby ruby-on-rails-3 many-to-many has-and-belongs-to-many


【解决方案1】:

您必须将genre_ids 添加到您的大量可分配属性:

attr_accessible :genre_ids

然后您的数据在albums_genres 中创建记录。

在您的Album 中,您将获得genresgenre_ids 的集合。第一个包含Genre 对象的数组,第二个包含流派的ids 的数组。
您可以添加或分配给这两个数组,以管理关联。
批量分配只是设置genre_ids,但需要明确许可(批量分配限制)。

【讨论】:

  • 最重要的是,将您的current_user.id 作为hidden_field 放入您的表单中,将User 保存在您的AlbumsController#create 操作中是一个混乱的代码(hidden_field_tag "user_ids[]", current_user.id)跨度>
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多