On 3/1/06, Bob Silva <[EMAIL PROTECTED]> wrote:
> Hi,
>
> I'm working on converting the test suite over to AR::Schema.
> I'm finding there are a lot of barriers to doing this due to somewhat
> limited customization support in AR::Schema.
>
> Here are some ideas (some implemented already) to extend AR::Schema, but
> still keep it (relatively) true to its original design.
>
> Foreign Key Support (MySQL in this instance):
>
> create_table(:accounts) do |t|
>   t.column :company_id, :integer, :null => false, :foreign_key_table =>
> :companies
> end
>
> =>
>
> create table accounts (
>   id int(11) not null auto_increment primary key,
>   company_id int(11) not null foreign key (`company_id`) references
> `companies`(`id`)
> )
>
> I've got this working great for all adapters already. Though not shown here,
> you can also pass :foreign_key_column for non-standard primary key column
> names.
>

there's a plugin that requires some hacking but it's a decent approach
to supporting foreign keys.  I mentioned on IRC i'd be down to workout
a plugin for this.

http://wiki.rubyonrails.com/rails/pages/Foreign+Key+Schema+Dumper+Plugin

>
> Since there are times where it doesn't make sense for AR::Schema to support
> a specific column type/definition, what are your ideas on this (from the
> postgres.sql):
>
> CREATE TABLE geometrics (
>   id serial primary key,
>   a_point point,
>   a_line_segment lseg,
>   ...
> );
>
> Can be generated as such:
>
> create_table(:geometrics) do |t|
>   t.column :a_point, :custom, :type => "point default (1,3)",
>   t.column :a_line_segment, :custom, :type => "lseg",
>   ...
> end

I think :custom would make for a cool plugin but something seems
awkward about it to me.  I don't know why. :)

>
> The keywords ":custom and :type" aren't important here, the concept is.
> ":describe and :description", ":define and :definition" are alternatives.
> I think this would be a nice addition, but it depends on how pure you want
> to be, personally I lost all my pureness from years of PHP programming.
>
> Wait, there's more...
>
> Most adapters create an auto incrementing column differently. Some are built
> into the primary key column definition (MySQL, SQL Server), others use
> explicit sequences, others use functions etc.. combine this with the
> ability/desire to set the starting sequence number and it gets all messed up
> (which most of the AR unit tests schemas do).
> While there are no elegant solutions, I do believe its possible to support
> all adapters, by adding an empty create_sequence method in `module
> SchemaStatements` and have the adapters create their own if needed. To
> handle setting the start value, here's one idea:
>

I dig the idea of specifying a start sequence, I'm doing this in a
round about way at work currently. :(

> create_sequence(:accounts, :name => 'public.account_id_seq', :start => 100)
> create_table(:accounts) do |t|
> ...
> end
>
>
> Which adds whatever method the adaptor needs to implement the auto-increment
> column and set the start value. Some do it on the primary key column
> definition (SQL Server), some call a separate function (PGSQL), MySQL adds
> it as a table option after the closing ) etc. Option B for this one would be
> to change all the AR unit tests to not require the non-standard start
> sequence.
>
> And more...
>
> Primary Keys. While the convention is certainly to have an auto_incrementing
> integer primary key column, even the AR unit tests have table definitions
> with string based primary keys and some db_definitions have multi-column PKs
> defined. AR::Schema already has the ability to turn off auto generation of
> the primary key, I also propose a method to add an explicit PRIMARY KEY
> (column), for example, from an existing test fixture:
>
> create_table :subscribers do |t|
>   t.column :nick, :string, :limit => 100, :null => false
>   t.column :name, :string, :limit => 100
>   t.add_primary_key :nick
> end
>
create_table :subscribers, :primary_key => :nick do |t|
 ...
end

> =>
>
> CREATE TABLE `subscribers` (
>   `nick` varchar(100) NOT NULL,
>   `name` varchar(100) default NULL,
>   PRIMARY KEY (`nick`)
> ) TYPE=InnoDB;
>
> t.add_primary_key(:categories, :posts) would generate a multi-column pk

While I don't personally like composite keys maybe something like
create_table :articles, :primary_key => [:categories, :posts] do |t|
 ..
end

>
> While there are a ton more issues to deal with, I'll save those for later to
> not cloud these issues since these are the bigger ones I/we would need to
> tackle to achieve moving the unit tests to AR::Schema.
>
> I await your ideas/comments.
>
> Thanks,
>
> Bob Silva
> http://www.railtie.net/
>
>
>
> _______________________________________________
> Rails-core mailing list
> Rails-core@lists.rubyonrails.org
> http://lists.rubyonrails.org/mailman/listinfo/rails-core
>


--
Corey Donohoe
http://www.atmos.org/
[EMAIL PROTECTED]
_______________________________________________
Rails-core mailing list
Rails-core@lists.rubyonrails.org
http://lists.rubyonrails.org/mailman/listinfo/rails-core

Reply via email to