Rails 3: включить поле из has_many через ассоциацию - PullRequest
2 голосов
/ 30 января 2012

Моя модель ассоциации выглядит следующим образом:

#book model
class Book < ActiveRecord::Base
has_many :recommendations, :dependent => :destroy
has_many :similars, :through => :recommendations, :conditions => ['recommendation_type IS NULL'], :order => 'recommendations.created_at DESC'

#recommendation model
class Recommendation < ActiveRecord::Base
belongs_to :book
belongs_to :similar,  :class_name => 'Book', :foreign_key => 'similar_id'

#Books_controller -  injecting the recommendation_id
@book = Book.find(params[:id])
if params[:content_type]
  @content_type = params[:content_type];
else
  @content_type = "similars"
end

case @content_type

when "similars"
  # get the similars
  @book_content = @book.similars
  @book_content.each do |similar|
    @rec_id = Recommendation.where(:book_id=>similar.id, :recommendation_type=>'S').select('id').first.id
    similar << {:rec_id => @rec_id}
    # ^-- Above line gives NoMethodError (undefined method `<<' for #<Book:0x10de1f40>):
  end      

when "references"
  # get the references
  @book_content = @book.references
  @book_content.each do |reference|
    @rec_id = Recommendation.where(:book_id=>reference.id, :recommendation_type=>'R').select('id').first.id
    reference << {:rec_id => @rec_id}
    # ^-- Above line gives NoMethodError (undefined method `<<' for #<Book:0x10de1f40>): 
  end  
end

Итак, как отмечалось выше, в книге много похожих * от 1005 * до рекомендаций .Мое требование заключается в том, чтобы при извлечении похожих я также хотел бы включить id соответствующей записи в таблицу соединений рекомендации .
Мои вопросы:

  • Как мне включить поле * рекомендации_ид * вместе с аналогами ?

  • Еслиего нельзя включить напрямую, тогда как правильно
    определить это поле отдельно (как показано выше), а затем вставить его в переменную экземпляра Similars , чтобы я мог использовать его непосредственно в своих представлениях?

1 Ответ

0 голосов
/ 31 января 2012

Я рекомендую вам прочитать руководство Rails по ассоциациям, в частности о has_many: через ассоциации .

Большая часть вашего кода не имеет смысла - например:

@book_similars = Book.similars

Это означает, что у вас есть метод класса в модели Book для аналогов, но вы не упоминаете, что он определен или что он возвращает. Rails просто так не работает.

...