2010-06-30 2 views
0

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

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 Спасибо!

+0

Обновлено свой пост, пожалуйста, смотрите ниже. – dombesz

ответ

0

Ваша проблема заключается в том, что:

has_one :overall_ranking, :foreign_key => :poem_id 

означает, что награда имеет один OverallRanking и идентификатор премии в HAS_ONE отношении находится в столбце poem_id, т.е. логика неверна.

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

@award.poem.overall_rating 

Или в находке:

Award.all(:include => [:poem => {:overall_ranking}]) 
+0

см. правки, я не могу зависеть от Поэмы # id – user334626

+0

Hm. Затем вы можете указать: параметр primary_key, который укажет Rails, какой атрибут из Award вы хотите использовать для связи. Например: has_one: general_ranking,: foreign_key =>: poem_id,: primary_key =>: poem_id –

+0

Всё, спасибо: D – user334626

0

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

Вы могли бы хотеть попробовать joins.

Например:

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

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

+0

В Award.all Мне нужен poem_id для записи, к которой он присоединяется. Я не знаю, как это сделать. – user334626

+0

Award.all (: joins =>: general_ranking,: conditions => ["poem_id =?", Self.poem_id]) ??? – user334626

+0

Award.all (: joins => "LEFT JOIN' total_rankings' ON ​​awards.poem_id = total_rankings.poem_id ") ??? – user334626

0

Существует некоторая путаница для меня.

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}]) 

Update

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 

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

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

+0

см. Править выше. Я не могу зависеть от Poem # id, потому что Award - это отдельная копия, использующая poem_id. Премия делает копию в случае, если пользователь удаляет стихотворение (поэтому я могу сохранить награду видимой). thankyou – user334626

Смежные вопросы