Rails新手...试图了解正确的做事方式......
在我的应用中,用户可以创建一本书(我有那个工作)
我想要发生的是当用户创建一本书时,会将一条记录添加到BookCharacters表中,例如(id,book.id,user.id,characterdescription.string。)
创建图书时,创建图书的用户应自动添加为第一个BookCharacter。然后,用户可以根据需要手动添加/编辑任意数量的BookCharacters。但最初我希望它们默认自动添加。
所以在我的Book控制器中我有:
def create
@book = Book.new(params[:book])
respond_to do |format|
if @book.save
....
使用Rails,是否可以在保存书籍后添加这种逻辑?像
这样的东西Book.create( :creator => current_user.id)
我很感激帮助
答案 0 :(得分:19)
要理解的重要事项是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
都有效),将在books
和characters
中创建一行表格,其中字符行通过book_id
链接。
要显示某个角色也属于某个用户,您可以将该关系添加到角色模型中:
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。
答案 1 :(得分:0)
我更喜欢(如果User has_many Book):
def create
@book = current_user.books.new(params[:book])
respond_to do |format|
if @book.save
…