如何实际使用has_many / belongs_to关系?

时间:2014-12-17 16:44:08

标签: ruby-on-rails activerecord associations

我的两个模型是User has_many :booksBook belongs_to :user

users表只有name列,而books表有users_idtitle

这是我实际上应该如何使用它们吗?填充用户表后,如何通过搜索其姓名而不是ID列来完成添加特定用户的书籍?我知道这很简单,但我真的无法在Google上找到它,或者重新阅读我的书籍并重新观看我的Lynda视频;我知道信息必须在某处,但它现在已经完全煎死了我的大脑,而且我非常困惑。我非常习惯使用SQL并且学习使用ActiveRecord而不是想用左手写字。

我想要做的是在SQL中等同于INSERT INTO books (title, users_id) VALUES ("Wolves of the Calla", (SELECT id FROM users WHERE name = 'Sarah'));

4 个答案:

答案 0 :(得分:1)

找到具有给定名称的用户,然后使用该关联创建一个包含找到的user_id

的书
user = User.where(:name => "Sarah").first
user.books.create(:title => "Wolves of the Calla")

答案 1 :(得分:1)

正如Association Basics Guide中所述,你需要这样的东西:

createdBook = @user.books.create(title: "Wolves of the Calla")

答案 2 :(得分:0)

这可以在Rails Documentation中找到。如果你还没有这样做,那么值得一读。

关于这个问题:

  

...我该如何为特定用户添加图书...

您可以通过多种方式进行操作,但要记住的关键是has_manybelongs_to方法为您创建关联方法。通过这种方式,您可以检索并添加到对象的关联; Rails将负责处理外键等,只要它们按照命名约定命名(看起来你已经这样做了)

举一个简单的例子,将书籍添加到用户的书籍集合中,就像这样:

@user = User.where(name: "Sarah").first
@user.books.create(title: "Wolves of the Calla")

答案 3 :(得分:0)

#Rails 4 syntax
#Approach 1
@user = User.find_by(name: 'Sarah')
@book = @user.books.create(title: 'Wolves of the Calla')

#Alternatively
@user = User.find_by(name: 'Sarah')
@user.books << Book.create(title: 'Wolves of the Calla')

#Alternatively
@user = User.find_by(name: 'Sarah')
@book = Book.create(title: 'Wolves of the Calla')
@user.book_ids += [@book.id]