Рельсы находят путаницу - PullRequest
0 голосов
/ 30 июня 2010

Пожалуйста, помогите мне получить право на включение.

Poem 
  has_many :awards
  has_one  :overall_ranking

Award
  belongs_to :poem
  # before
  # has_one :overall_ranking, :foreign_key => :poem_id 
  ## SOLUTION
  # after
  has_one :overall_ranking, :foreign_key => :poem_id, :primary_key => :poem_id

OverallRanking
  belongs_to :poem

update: Award.all(:include => [:overall_ranking]) # works with SOLUTION

Обратите внимание, что я не могу зависеть от Poem#id, так как пользователи могут удалить стихотворение, но если это победитель, я делаю копию в Award, поэтому я должен зависеть только от Award#poem_id Спасибо!

Ответы [ 3 ]

0 голосов
/ 30 июня 2010

Есть некоторая путаница для меня.

Award
  belongs_to :poem
  has_one :overall_ranking, :foreign_key => :poem_id

Здесь вы используете один и тот же идентификатор для обоих отношений. Это означает, что вы пытаетесь получить общий рейтинг с помощью идентификатора стихотворения. Если я перевожу на sql, вы говорите что-то вроде:

overall_ranking.id = poem_id

Я думаю, что это неправильно.

Если вы хотите иметь одинаковые overall_ranking для award и poem, вы можете написать что-то вроде этого:

Award.rb
  belongs_to :poem
  has_one :overall_ranking, :through=>:poem

Вы можете включить как

Award.all(:include => [:overall_ranking])
or nested
Award.all(:include => [{:poem=>:overall_ranking}])

Обновление

1.Ваше соединение установлено неправильно.

Пожалуйста, смотрите: http://blog.hasmanythrough.com/2007/1/15/basic-rails-association-cardinality

Award
  belongs_to :poem
  belongs_to :overall_ranking, :foreign_key => :poem_id

OverallRanking
  belongs_to :poem
  has_one :award

Вы всегда должны иметь принадлежность_ к модели, в которой вы храните ссылочный идентификатор. 2. Но это не решает твою проблему в твоей логике. С этим у вас все еще будет связь между Award#poem_id = OverallRanking#id. Вы должны иметь Award#poem_id = OverallRanking#poem_id.

Я предлагаю добавить overall_ranking_id к Award, и все станет намного чище.

0 голосов
/ 30 июня 2010

Ваша проблема в том, что:

has_one :overall_ranking, :foreign_key => :poem_id

означает, что у Award есть один TotalRanking, и что идентификатор Award в отношении has_one находится в столбце poem_id, т.е. ваша логика неверна.

Было бы больше смысла, если бы вы просто использовали:

@award.poem.overall_rating

Или найти:

Award.all(:include => [:poem => {:overall_ranking}])
0 голосов
/ 30 июня 2010

Возможно, вы захотите дать больше информации, но я надеюсь, что это поможет:

Возможно, вы захотите попробовать joins.

Например:

Award.all(:joins => :overall_ranking, :conditions => ['some_attribute_from_overall_ranking=?', true])

Так что это найдет награды и include общий_ранкин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...