Переименуйте foreign_key для переопределения в Rails Convention - PullRequest
2 голосов
/ 30 марта 2012

У меня проблема в связи между двумя классами, поэтому у меня есть таблица классов с именем Post

Class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
        t.string :post_type , null: false
        t.text :content , null: false
        t.integer :person_id
    end
    add_index :posts, :person_id
    add_index :posts, :group_id
  end
end

а другой называется Действие

class CreateActions < ActiveRecord::Migration
  def change
    create_table :actions do |t|
        t.string :target_type, null:false
            t.integer :target_id
        t.integer :upvote_count
      t.timestamps
    end
      add_index :actions,:target_id
  end
end

поэтому проблема в том, что я хочу связать target_is как внешний ключ с классом Post, поэтому я сделал это

class Post < ActiveRecord::Base
    has_one :action
end
class Action < ActiveRecord::Base
    belongs_to :post , :class_name => 'Target', :foreign_key => 'target_id'
end

но это не работает, что, когда я назначаю объект Action методу действия в Post объекте, появляется эта ошибка

Mysql2::Error: Unknown column 'actions.post_id' in 'where clause': SELECT  `actions`.* FROM `actions`  WHERE `actions`.`post_id` = 6 LIMIT 1

так какая помощь?

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Необходимо установить внешний ключ с обеих сторон ассоциации:

class Post < ActiveRecord::Base
    has_one :action, :foreign_key => 'target_id'
end
class Action < ActiveRecord::Base
    belongs_to :post , :class_name => 'Target', :foreign_key => 'target_id'
end

http://guides.rubyonrails.org/association_basics.html#has_one-association-reference

http://guides.rubyonrails.org/association_basics.html#belongs_to-association-reference

1 голос
/ 30 марта 2012

Полагаю, вы пытаетесь применить полиморфную ассоциацию.Попробуйте это.

class Post < ActiveRecord::Base
has_one :action, :as => :target
end

class Action < ActiveRecord::Base
belongs_to :target, :polymorphic => true
end
...