База данных много ко многим - PullRequest
0 голосов
/ 23 января 2011

Это, вероятно, базовый материал, но я действительно сделал свою домашнюю работу, разыскивая его. Я до сих пор не могу найти решение.

У меня есть дБ пользователей, дБ фильмов и дБ рейтингов. В рейтингах есть movie_id, user_id и оценка.

class Rating < ActiveRecord::Base

  attr_accessible :grade

  belongs_to :user
  belongs_to :movie
end

class User < ActiveRecord::Base

  has_many :ratings, :dependent => :destroy
  has_many :movies, :through => :ratings
...


class Movie < ActiveRecord::Base

  has_many :ratings, :dependent => :destroy
  has_many :users, :through => :ratings
...

Но я не могу создать рейтинг как с movie_id, так и с user_id

rails c test
Loading test environment (Rails 3.0.3)
@movie=Factory(:movie)
 #<Movie id: 1, title: "Rocky 20", link: "#", created_at: "2011-01-22 21:04:42", updated_at: "2011-01-22 21:04:42">
 @user=Factory(:user)
 #<User id: 1, name: "lola", email: "lola@gmail.com", created_at: "2011-01-22 21:04:48", updated_at: "2011-01-22 21:04:48", encrypted_password: "c306a696138fa08c543ada3a3b4fd92067e9941743b7558e891...", salt: "f82c6abaccec17e2866d50150ad200181eb4bc8e0204249f171...", admin: false>
>> @user.ratings.create(:grade=> 4, :movie_id =>@movie.id)
=> #<Rating id: 1, grade: 4, user_id: nil, movie_id: nil, created_at: "2011-01-22 21:04:55", updated_at: "2011-01-22 21:04:55">

что "movie_id: nil" - это то, что убивает меня ...

тогда конечно мне тесты не пройдут @ user.rating.create (grade => 5,: movie_id => @ movie.id) не имеет значения movie_id @ movie.rating.create (grade => 5,: user_id => @ user.id) не имеет user_id

есть намеки?

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 25 января 2011

Попробуйте определить ваши фабрики следующим образом:

Factory.define :movie, :class => Movie do |f|
  f.title "Rocky 20"
  f.link "#"
end

Factory.define :user, :class => User do |f|
  f.name "Lola"
  f.email "lola@gmail.com"
end

Factory.define :rating, :class => Rating do |f|
  f.movie { |m| m.association :movie}
  f.user { |u| u.association :user}
  f.grade 4
end

Затем, чтобы проверить рейтинг, используйте фабрику рейтингов отдельно:

it "creates a rating" do
  rating = Factory.create(:rating)
  rating.user.name.should == "Lola"
  rating.movie.title.should == "Rocky 20"
end
0 голосов
/ 23 января 2011

Код, который вы показываете здесь, должен работать IMO.Что заставляет меня догадываться, что это то, что вы здесь не показываете.Я бы попробовал пару вещей:

  • Используйте обычную консоль для изменения
  • Не используйте фабрики (возможно, это они?), Вместо этого создайте реальные записи

Я попробовал ваш пример, и вот что я получил:

> m = Movie.create :title => "Foo"
=> #<Movie id: 1, title: "Foo", created_at: …> 

> u = User.create :name => "Marc"
=> #<User id: 1, name: "Marc", created_at: …> 

> u.ratings.create :grade => 4, :movie_id => m.id
=> #<Rating id: 1, grade: 4, user_id: 1, movie_id: 1, created_at: …> 
> m.ratings.create :grade => 3, :user_id => u.id
=> #<Rating id: 2, grade: 3, user_id: 1, movie_id: 1, created_at: …> 

Который вы также можете использовать следующим образом, как вы, возможно, знаете:

> m.ratings.create :grade => 3, :user => u
=> #<Rating id: 3, grade: 3, user_id: 1, movie_id: 1, created_at: …> 
...