как управлять 3-мя многими моделями в Rails - PullRequest
3 голосов
/ 25 августа 2010

Я следую Railscast Советы по созданию другой модели для поддержания many-to-many отношений. Однако у меня возникли проблемы с извлечением данных о транзитивных отношениях.

Представьте себе, что есть 3 модели со многими ко многим: User <-> Color <-> Shades

Я сделал еще 2 модели:

ColorLiking (maintains User <-> Color), DiffShades (maintains Color <-> Shades)

Вопрос Теперь, если все настроено правильно ... как мне найти Shades, который принадлежит User?

Как я настрою эти отношения?

class User < ActiveRecord::Base
   has_many :shades, :through=>:diffShades, :source => :color
end

выше, похоже, не работает ...

При использовании SQL следующий запрос будет работать:

select * from shades 
  where id in (select shade_id from diffshades 
                where color_id in (select color_id from colorlikings 
                                     where user_id = ?))

1 Ответ

0 голосов
/ 25 августа 2010

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

Короче говоря, ActiveRecord не поможет вам полностью перейти к методу User.shades только с различными вызовами: has и: own. Но не так уж страшно написать свой собственный метод модели для этого.

class User < ActiveRecord::Base
   has_many :color_likings
   has_many :colors, :through => :color_likings

   def get_shades
     colors.collect {|c| c.shades.to_a}.flatten
   end
end

class ColorLiking < ActiveRecord::Base
  belongs_to :user
  belongs_to :color
end

class Color
  has_many :color_likings
  has_many :users, :through => :color_likings  
end

class DiffShade
  belongs_to :color
  belongs_to :shade
end

class Shade
  has_many :diff_shades
  has_many :colors, :through => :diff_shades
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...