ruby-on-rails - Rails 3,如何在创建主记录后添加关联记录(Books,自动添加BookCharacter)

标签 ruby-on-rails ruby-on-rails-3

Rails新手...试图了解正确的做事方式...

在我的应用程序中,用户可以创建一本书(我正在使用该书)

我想发生的是,当用户创建一本书时,一条记录被添加到BookCharacters表中,类似于(id,book.id,user.id,characterdescription.string)。

创建书籍时,创建该书籍的用户应自动添加为第一本书。之后,用户可以根据需要手动添加/编辑任意数量的BookCharacter。但是起初我希望默认情况下自动添加它们。

所以在我的Book Controller 中,我有:

def create
 @book = Book.new(params[:book])
 respond_to do |format|
  if @book.save
....

使用Rails,在保存本书之后添加这种逻辑的做法是否可行?就像是
Book.create( :creator => current_user.id)

我感谢您的帮助

最佳答案

要了解的重要一点是Rails使用ActiveRecord实现关系的约定。一本书有很多字符,每个字符都属于一本书,因此:

class Book < ActiveRecordBase
  has_many :characters
end

class Character < ActiveRecordBase
  belongs_to :book
end

现在,Rails假定characters表将具有一个名为book_id的外键,该外键与books表相关。要创建属于一本书的角色,请执行以下操作:
@book = Book.new(:name=>"Book name")
@character = @book.characters.build(:name=>"Character name")

现在,保存了@book(假设@book@character均有效)后,将在bookscharacters表中创建一行,并通过book_id链接字符行。

要显示角色也属于用户,可以将该关系添加到Character模型中:
class Character < ActiveRecordBase
  belongs_to :book
  belongs_to :user
end

因此,Rails现在期望characters也具有称为user_id的外键,该外键指向users表(也需要User模型)。在创建角色时指定用户:
@book = Book.new(:name=>"Book name")
@character = @book.characters.build(:name=>"Character name",:user=>current_user)

您还可以通过在对象上调用相应的方法来分配外键:
@character.user = current_user

所有这些都是有效的,因为它遵循用于命名模型和表的Rails约定。您可以背离这些约定,但是如果您这样做的话,您将很难学习Rails。

关于ruby-on-rails - Rails 3,如何在创建主记录后添加关联记录(Books,自动添加BookCharacter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3739158/

相关文章:

ruby-on-rails - rvm ruby​​ 1.9.2 和 Rails 3.1 无法启动服务器

ruby-on-rails - 如何让rails在数据库更新后使用ajax更新HTML表行?

ajax - Devise + Rails 3.0.4 在 AJAX 请求后结束 session

ruby-on-rails - Rspec 的文档在哪里?

ruby-on-rails - 如何使用 pry 调试器检查 rspec 变量

ruby-on-rails - Redis 去 - Heroku - Rails

ruby-on-rails - 如果 XML 映射是根元素,则无法加载数组

ruby-on-rails-3 - pg_search 不返回单个字段的结果

ruby-on-rails - Compass 有什么好的 CSS 按钮框架?

ruby-on-rails - 使用 Rails 5 丢失迁移文件的自定义代码