为什么这个连接表总是在做posts_tags?

时间:2014-04-24 16:37:58

标签: sql ruby-on-rails relationship rails-migrations

当我使用以下内容时:

class CreateJoinTableTagsPosts < ActiveRecord::Migration
  def change
    create_join_table :tags, :posts do |t|
        t.index [:tag_id, :post_id]
    end
  end
end

或以下:

class CreateJoinTableTagsPosts < ActiveRecord::Migration
  def change
    create_join_table :posts, :tags do |t|
        t.index [:post_id, :tag_id]
    end
  end
end

我总是得到一个posts_tags的表,并且作为结果模型中的辅助方法的结果:

class Post < ActiveRecord::Base
  belongs_to :blogs

  has_and_belongs_to_many :tags, join_table: 'tags_posts'
  has_and_belongs_to_many :categories, join_table: 'categories_posts'
  has_many :comments

  validates :title, presence: true

  def has_tag?(tag_name)
    tag == tag_name
  end

  def assign_tag=(tag_name)
      tag = Tag.find_by(name: tag_name) || Tag.create(name: tag_name)
      self.tag = [tag] if tag
  end

end

实际上不工作。正如您所看到的,assign_tag方法实际上不起作用,这样做的测试是:

it "should create a page for a post" do
  @post.assign_tag = 'Sample Tag'
end

失败,因为关系标签不存在。我相信这可以通过创建tags_posts的相应联接表而不是它始终创建的联接表来解决posts_tags

想法?

1 个答案:

答案 0 :(得分:1)

create_join_table使用参数的词法顺序来命名表。

您可以使用table_name选项覆盖此内容:

create_join_table :posts, :tags, table_name: 'tags_posts' do |t|
    t.index [:post_id, :tag_id]
end