2011-01-22 4 views
0

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

У меня есть пользователи db, db фильмов и рейтинги db. Рейтинги имеют movie_id, user_id и оценку.

Но я не могу создать рейтинг как с 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: "[email protected]", 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: ноль" является то, что убивает меня ...

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

Подсказки?

Спасибо!

ответ

0

Код, который вы показываете здесь, должен работать 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: …> 
+0

спасибо за попытку! Я узнал, что использовал «attr_accessible: grade», но если я это сделаю, я не могу назначить параметр movie_id. Есть ли способ ограничить массовые задания и в то же время каким-то образом вставить информацию? – brunosan

0

Попробуйте определения ваших заводов, как это:

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 "[email protected]" 
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 
Смежные вопросы