2012-10-19 60 views
0

我有2种型号:的Rails不能创建HABTM关系

class Hashtag < ActiveRecord::Base 
    has_and_belongs_to_many :photos 
    attr_accessible :name 
*** 
end 

class Photo < ActiveRecord::Base 
    has_and_belongs_to_many :hashtags, :uniq => true 
*** 
end 

关系创建代码:

photo = current_user.photos.new(params[:photo]) 
if !photo.nil? and photo.save! 
    photo.text.scan(/#[[:alnum:]]+/).each do |billet| 
      next if billet.length > 25 
      hashtag = Hashtag.first_or_initialize(:name => billet) 
      if hashtag.persisted? 
       hashtag.touch 
      else 
       hashtag.save! 
      end 
      photo.hashtags << hashtag 
     end 
    render json: photo 
end 

但它不工作。看起来哈希标签永远不会被保存。这段代码有什么问题?

UPD:

加入表:

def up 
    create_table :hashtags_photos, :id => false do |t| 
     t.integer :photo_id 
     t.integer :hashtag_id 
    end 

    add_index :hashtags_photos, [:photo_id, :hashtag_id], :unique => true 
    end 

和错误:

ActiveRecord::AssociationTypeMismatch: Hashtag(#70233360314580) expected, got TrueClass(#70233335523020) 
+0

如果有什么你把'photo.hashtags如果hashtag.persisted?上面的? –

+0

您是否创建了连接表来实现habtm关系? – davidb

回答

0

权的方式来做到这一点:

text.scan(/#[[:alnum:]]+/).each do |workpiece| 
     next if workpiece.length > 25 
     hashtag = Hashtag.find_by_name(workpiece) 
     if hashtag 
      hashtag.touch 
     else 
      hashtag = Hashtag.create!(:name => workpiece) 
     end 
     hashtags << hashtag 
end