当我使用以下内容时:
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
想法?
答案 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