Близорукость WRT has_many: через - PullRequest
0 голосов
/ 15 февраля 2011

Я просто не вижу, что не так с этим кодом.Вот спецификация:

it "Meta tags should not duplicate for a particular page" do
  p1 = Page.create!(:title => 'first page', :body_text => 'p1 body text')
  p2 = Page.create!(:title => 'second page', :body_text => 'p2 body text')
  p1.add_meta_tag(:content => 'alexa', :description => '100')
  p2.add_meta_tag(:content => 'alexa', :description => '200')

  p1.meta_tags.where("content = 'alexa'").should have(1).record
  p2.meta_tags.where("content = 'alexa'").should have(1).record
end

Модели:

class Page < AR::Base
  has_many :page_to_meta_tag_maps
  has_many :meta_tags, :through => :page_to_meta_tag_maps

  # BONEHEAD PROBLEM PROBABLY HERE...
  def add_meta_tag(options)
    @cm = self.meta_tags.where(["content=?", options[:content]]).first
    @current_meta = @cm || MetaTag.create(options)
    @current_meta.description = options[:description]
    self.meta_tags << @current_meta
  end
end

class PageToMetaTagMap < ActiveRecord::Base
  belongs_to :page
  belongs_to :meta_tag
end

class MetaTag < ActiveRecord::Base
  attr_accessible :content, :description

  has_many :page_to_meta_tag_maps
  has_many :pages, :through => :page_to_meta_tag_maps
end

Спецификация не работает, говоря, что есть 2 записи, а не 1. Логи показывают, что Rails делает INSERT каждуювремя, и @cm в области ЗАДАЧИ КОСТНОЙ ЧАСТИ всегда равен нулю.Я, должно быть, в корне неправильно понимаю что-то здесь.

Мне нравится, когда это происходит, и есть нехватка времени: (

1 Ответ

0 голосов
/ 15 февраля 2011

Я изменил код ПРОБЛЕМЫ КОСТНОЙ ЧАСТИ на:

def add_meta_tag(options)
  @current_meta = self.meta_tags.where(["content=?", options[:content]]).first
  if @current_meta
    @current_meta.description = options[:description]
    @current_meta.save
  else
    @current_meta = MetaTag.create(options)
    self.meta_tags << @current_meta
  end
end

, что решает проблему.Я не могу не думать, что есть лучший способ ...

...