Question about find_by

hi,

i am new to ruby/rails, and i am struggling with the find_by method.
Heres some background on what i am trying to get done:

I have a User object, and a Book. User has_one Book, and Book
belongs_to User.

basically, i have a combo box which displays all the books, i get the
id the book is stored in, from the form and then in the user model
class, i try and find the according and assign the according book,
with this find method:

self.book = Book.find_by_id(b_id)

unfortunately i end up with this error:

Mysql::Error: #42S22Unknown column ‘books.user_id’ in ‘where clause’:
SELECT * FROM books WHERE (books.user_id = 1) LIMIT 1

I dont understand why it is searching the user_id column (which doesnt
exist), rather than id …

At first, i thought something was wrong with my Book.find_by
statement, but i tried the same line in an ActionMailer, and it worked
fine.

can someone please clear this up?

thanks!

My guess is that it’s because you are using self in the User class.

Try:

@book = Book.find_by_id(b_id)

My guess is that the associations are set up wrong. If a User has_one
Book then it will indeed assume there’s a user_id column on books. It
may seem slightly unintuitive, but you may want to swap it around - a
User belongs_to a Book, if you have a book_id column on the users
table, and a Book has_one (or has_many) User(s).

Hi Gabriel,

you guessed right…that was my mistake…it does seem counter
intuitive, but my user has the book id, and my books do not has a
user_id, since a book can belong to many users.

but it still isnt working, this line seems to fail in my rhtml file:

Book: <%= current_user.book %>

can i not access relationships this way?

i actually copied the wrong thing. i originally had what you
suggested, but it was failing…after snoopin around a bit…i
realized i accidentally deleted the ‘end’ at the end of my Book
class…stupid vi…

thanks!

Unless you’ve defined a to_s method on Book, you want to call the
explicit attribute you wish to display the value of - like
current_user.book.name or current_user.book.title for example.