在Rails

时间:2015-09-01 18:02:34

标签: ruby-on-rails ruby

我有一些问题。我是RoR的新手

我尝试使用Rails迁移创建连接表。这方面的文件是...... http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-create_join_table

当我这样做时......

rails g migration CreateJoinTableUserOffer users offers

...它会创建以下迁移

class CreateJoinTableUserOffer < ActiveRecord::Migration
 def change
   create_join_table:users, :offers  do |t|
         t.index [:user_id, :offer_id]
         t.index [:offer_id, :user_id]
      end       
    end
   end

当我这样做的时候......

rake db:migrate 

它创造了......

-- Table: offers_users

-- DROP TABLE offers_users;

CREATE TABLE offers_users
(
 user_id integer NOT NULL,
 offer_id integer NOT NULL
)
WITH (



OIDS=FALSE
);
ALTER TABLE offers_users
 OWNER TO sudeepkaushik;

-- Index: index_offers_users_on_offer_id_and_user_id

-- DROP INDEX index_offers_users_on_offer_id_and_user_id;

CREATE INDEX index_offers_users_on_offer_id_and_user_id
 ON offers_users
 USING btree
 (offer_id, user_id);

-- Index: index_offers_users_on_user_id_and_offer_id

-- DROP INDEX index_offers_users_on_user_id_and_offer_id;

CREATE INDEX index_offers_users_on_user_id_and_offer_id
 ON offers_users
 USING btree
 (user_id, offer_id);
  

我想要做的是我首先要求表名为users_offers而不是offers_users,为此您可以在create_join_table迁移中指定:table_name。我无法正确设置此选项的语法。需要帮助!

     

第二,我注意到这次迁移并没有创建我期望用户和优惠表的外键。这里也需要你的评论。我是否需要自己手动创建外键?

1 个答案:

答案 0 :(得分:3)

您可以使用table_name选项定义联接表名称。

create_join_table :users, :offers, table_name: :users_offers

还有一个选项可以设置名为column_options的列选项,但我只能使用它来处理索引而不是外键。

create_join_table :users, :offers, column_options: { index: true }

这将创建所需的索引,但忽略foreign_key: true。所以你需要单独创建它们。

add_foreign_key :users_offers, :users
add_foreign_key :users_offers, :offers

在您的模型中,您需要添加如下关系:

# user.rb
has_and_belongs_to_many :offers, join_table: :users_offers

# offers.rb
has_and_belongs_to_many :users, join_table: :users_offers