Rails Many to Many с условием добавления нового условия - PullRequest
0 голосов
/ 27 июля 2011

Я моделирую пользователей и фильмы с "любимым" и "рекомендованным".

Модели следующие:

class Movie < ActiveRecord::Base
  attr_accessible :title, :imbd_id

  has_and_belongs_to_many :liked_by, :class_name => "User", 
    :conditions => { "type" => "like" }
  has_and_belongs_to_many :recommended_by, :class_name => "User", 
    :conditions => { "type" => "recommend" }

end

class User < ActiveRecord::Base

  has_and_belongs_to_many :movies_liked, :class_name => "Movie", 
    :conditions => { "type" => "like" }
  has_and_belongs_to_many :movies_recommended, :class_name => "Movie", 
    :conditions => { "type" => "recommend" }

end

с одной таблицей для сопоставления отношений:

 create_table "movies_users", :id => false, :force => true do |t|
    t.integer  "user_id"
    t.integer  "movie_id"
    t.string   "type"           # this can be "like" or "recommend"
    t.string   "status_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

Теперь я получаю сообщение об ошибке при попытке сделать

u = User.first
m = Movie.first
u.movie_liked << m 

со следующей ошибкой

ruby-1.9.2-p290 :003 > u.movies_tweeted << m 
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: movies.type: SELECT * FROM "movies" INNER JOIN "movies_users" ON "movies".id = "movies_users".movie_id WHERE ("movies_users".user_id = 1  AND ("movies"."type" = 'like'))

Любая идея, которую я могу структурировать так, чтобы я мог просто использовать оператор << и он автоматически назначит правильный тип? </p>

Спасибо!

1 Ответ

1 голос
/ 27 июля 2011

Вы можете создавать модели Recommendation и Like и использовать их для объединения пользователей с фильмами. Или просто одна модель под названием не знаю как (RecommendLike?), Если вы действительно хотите сэкономить на одном столе. А потом:

User
  has_many :recommendations
  has_many :movies_recommended, :class_name => "Movie", :through => :recommendations
  has_many :likes
  has_many :movies_liked, :class_name => "Movie", :through => :likes
...