2014-12-17 3 views
1

Мои две модели: User has_many :books и Book belongs_to :user.Как можно использовать отношения has_many/belongs_to?

users таблица имеет только столбец name, в то время как books таблица имеет users_id и title.

Это как я на самом деле должен их использовать? С заполненной таблицей пользователей, как я могу добавить книгу с конкретным пользователем, выполнив поиск их имени, а не столбец идентификатора? Я знаю, что это просто, но я действительно не могу найти его в Google или перечитывать свои книги и пересматривать мои видео Lynda; Я знаю, что информация должна быть где-то там, но сейчас она полностью обжаривает мой мозг, и я очень смущен. Я очень привык к SQL, и изучение ActiveRecord вместо этого похоже на попытку написать левой рукой.

Что я хочу сделать, это эквивалент, в SQL, INSERT INTO books (title, users_id) VALUES ("Wolves of the Calla", (SELECT id FROM users WHERE name = 'Sarah'));.

+1

Просто к сведению, что столбец в вашем 'books' таблицы должны быть' user_id' единственного числа. Не множественное число. –

ответ

0

Все это можно найти на странице Rails Documentation. Его стоит прочитать, если вы еще этого не сделали.

В отношении этого вопроса:

... как я могу идти о добавлении книги с конкретным пользователем ...

Там целый ряд способов, которыми Вы можете сделать это , но важно помнить, что методы has_many и belongs_to «создают» методы ассоциации для вас. Таким образом вы можете получить и добавить к ассоциациям объекта; Rails позаботится о работе с внешними ключами и т. Д., Если они указаны в соответствии с его соглашением об именах (что, кажется, вы сделали)

Так, например, чтобы добавить книгу в коллекцию пользователя книг, было бы что-то вроде этого:

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

Спасибо, тонна, это действительно помогает. Это тоже имеет большой смысл, я просто этого не видел. Оценил. – GreenTriangle

1

Найти пользователя с указанным именем, а затем использовать ассоциацию, чтобы создать книгу с найденными user_id

user = User.where(:name => "Sarah").first 
user.books.create(:title => "Wolves of the Calla") 
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] 
Смежные вопросы