For reference, that PR is now open <https://github.com/rails/rails/pull/18791>.
On Sunday, February 1, 2015 at 2:29:39 PM UTC, Chris Sinjakli wrote: > > Sounds good. Glad to have a decision on this so we can get away from > random names. > > I'm happy to do the work and get a PR in. Should hopefully have some time > in the next week. > > Cheers, > Chris > > On 30 January 2015 at 10:48, Yves Senn <yves.s...@gmail.com> wrote: > >> I'm not convinced that we need human readable foreign key names right now. >> Since 4.2. is out with this issue, for the time being I'd like to focus >> on a backportable solution. >> >> A pull request with deterministic names but still non-human readable is >> very welcome. >> This should be a fairly controlled change that we can bring back to >> `4.2.x` to solve the issue. >> >> We're open to consider human readable names if they become more relevant >> in the future (what Simon Riggs suggests). >> If you happen to know more about these plans, please keep us posted so we >> can adjust accordingly. >> >> @Chris Sinjakli: Thank you for your patience. Please let me know if you >> are up to work on a PR. >> Otherwise it would be good to file an issue on GitHub so that someone >> else can take over. >> >> Cheers, >> -- Yves Senn >> >> On Monday, January 26, 2015 at 5:36:15 PM UTC+1, Chris Sinjakli wrote: >>> >>> I think changing the semantics of `add_foreign_key` is best saved for >>> another discussion. The naming change seems to be contentious enough by >>> itself. ;) >>> >>> A quick summary of the tradeoffs for human readable names: >>> >>> + Consistency with index naming >>> + When they show up in query plans, they'll be understandable >>> - They can fall out of date >>> - They can be too long and require manual naming >>> >>> To my mind, the code for renaming them shouldn't be a huge leap from the >>> same code that's there for indexes. The most obvious issue is support for >>> constraint renaming in different databases. Postgres only has this in 9.2+, >>> so we'd have to do version checks. By contrast index renaming support goes >>> back to at least 8.0. I have no idea about MySQL. >>> >>> That said, the foreigner gem (which this built-in functionality >>> replaces) has been generating human readable FK names without renaming them >>> for ages. I'd be really interested in knowing whether this was a major >>> issue for people using it (other than me). From what I can see, this got >>> brought up once (https://github.com/matthuhiggins/foreigner/issues/141) >>> and wasn't discussed. >>> >>> I'm getting the feeling this is an issue which just needs someone who's >>> in charge of activerecord to make a call. I'd like to have the readable >>> names back myself, but it's not my call and opinions are pretty divided on >>> here. >>> >>> On 17 January 2015 at 12:08, Will Bryant <will....@gmail.com> wrote: >>> >>>> True - good point. Using random values is a bit weird though, since >>>> two people running the same migration will get different names, and then >>>> their schemas will never quite match. This means dev machines’ schemas >>>> will differ from staging/test environments and them from production. >>>> >>>> Wouldn’t a simple CRC hash of the input data equally solve the issue of >>>> names potentially getting out of date, without introducing >>>> non-determinancy? >>>> >>>> More way-too-late bikeshedding: IMHO the method in 4.2 should be >>>> renamed to add_foreign_key_with_constraint. A foreign key is just the >>>> key for an association. A foreign key constraint is a different concept >>>> to >>>> a foreign key. >>>> >>>> IMHO it’s really important that users understand the difference, and >>>> only add constraints when they want them. >>>> >>>> The thing is, if you live your life on recent versions of PostgreSQL, >>>> they work well enough to be usable. But on MySQL particularly - and in >>>> PostgreSQL before they implemented the special weakened lock types - they >>>> cause a lot of unintended side effects because they result in a standard >>>> shared lock being taken on the parent row. >>>> >>>> On one of my big apps we put FKCs in in ~2008, and we’re now actually >>>> going through dropping FKCs when we get the chance, because they just >>>> cause >>>> too many problems at runtime. >>>> >>>> Basically, if table A is a parent to table B, and you have an FKC >>>> linking the two, then an update to a B row will take some kind of shared >>>> lock on A. But it’s also common to have a form for A records which nests >>>> B >>>> records, and then in practice the #update action is going to save A, and >>>> then save the Bs… and then you get deadlocks. >>>> >>>> I’ve been finding this sort of problem (there’s others) comes up so >>>> often that I’ve gone right off the idea of foreign key constraints, and >>>> now >>>> tell ppl to only add them when they specifically need them. (And I find >>>> usually it’s relatively rare that you do in practice because a lot of >>>> parent tables don’t get deletes, and those that do you tend to want to >>>> seralize things using update locks anyway.) >>>> >>>> TL;DR I would like people to learn from our mistakes and not to >>>> accidentally get foreign key constraints when they think they are just >>>> adding a foreign key :). >>>> >>>> >>>> On 17/01/2015, at 23:32 , Yves Senn <yves...@gmail.com> wrote: >>>> >>>> Yes, they are shown in constraint error messages, but so are the >>>> metadata (table name and referenced column name). >>>> Following are example messages: >>>> >>>> MySQL: >>>> ----------- >>>> ERROR 1452 (23000): Cannot add or update a child row: a foreign key >>>> constraint fails (`activerecord_unittest`.`fk_test_has_fk`, >>>> CONSTRAINT `fk_rails_bde121d5a6` FOREIGN KEY (`fk_id`) REFERENCES >>>> `fk_test_has_pk` (`id`)) >>>> >>>> PostgreSQL: >>>> ----------------- >>>> ERROR: insert or update on table "fk_test_has_fk" violates foreign key >>>> constraint "fk_rails_bde121d5a6" >>>> DETAIL: Key (fk_id)=(98493849) is not present in table >>>> "fk_test_has_pk". >>>> >>>> Both messages have all the detail needed to understand what's going on. >>>> From that perspective >>>> I don't see the need to duplicate the metadata in the constraint name. >>>> >>>> Simon: I didn't know about that. Is there a discussion or documentation >>>> that goes into >>>> further detail? I'd like to read up on these planed changes. This could >>>> affect what >>>> implementation we are going to pursue. >>>> >>>> Cheers, >>>> -- Yves >>>> >>>> On Saturday, January 17, 2015 at 2:01:25 AM UTC+1, will.bryant wrote: >>>>> >>>>> They may not be shown in query plans, but they are shown in constraint >>>>> error messages, and the possibility of hitting those errors is the whole >>>>> reason one adds foreign key constraints. It’s helpful to have an >>>>> indication which kind of constraint was invalidated without having to >>>>> look >>>>> through the schema. >>>>> >>>>> We do already tolerate the index names being irrelevant if they become >>>>> inconsistent, but in my personal experience that doesn’t happen very >>>>> often >>>>> at all, since I’ve found indexed columns tend to be important and keep >>>>> their names. >>>>> >>>>> So I would vote for meaningful names too. Just my 2c. >>>>> >>>>> >>>>> On 16/01/2015, at 01:42 , Yves Senn <yves...@gmail.com> wrote: >>>>> >>>>> Hey Chris >>>>> >>>>> Sorry for my late response. >>>>> >>>>> tl;dr: I'd rather not go for consistency with index naming but for a >>>>> consistent hash approach. >>>>> >>>>> We have descriptive names for indexes because they are shown to the >>>>> user in query plans. >>>>> This is not the case with foreign keys. When inspecting a database you >>>>> can look at the >>>>> constraint metadata. I don't see much value in encoding that metadata >>>>> into the name. >>>>> >>>>> In my opinion the drawbacks in the implementation are more sever. We >>>>> faced a lot of issues >>>>> when automatically renaming indexes. There are still cases where they >>>>> fall out of sync >>>>> with the actual metadata. Having descriptive names, which no longer >>>>> represent the metadata >>>>> is way worse in my opinion. >>>>> Also constant renaming when renaming tables and columns is not very >>>>> practical. The added >>>>> issue of the limited size makes this even worse. >>>>> >>>>> My gut feeling is in favor of constant non-descriptive names. I do >>>>> remember that I implemented >>>>> that exact behavior but we pivoted to purely random names. I'd like to >>>>> go through our archived >>>>> discussions regarding that change to make sure we have all the needed >>>>> information. >>>>> I haven't had the time to do so. >>>>> >>>>> Cheers, >>>>> -- Yves >>>>> >>>>> On Thursday, January 15, 2015 at 1:25:18 PM UTC+1, ch...@ >>>>> sinjakli.co.uk wrote: >>>>>> >>>>>> My own preference is towards the longer, descriptive names. Partly >>>>>> for consistency with index naming, and partly because it's nice to be >>>>>> able >>>>>> to glance at them and know what they are (though I understand the >>>>>> argument >>>>>> for them falling out of date). >>>>>> >>>>>> I'll go ahead and make a PR for that option. If there's serious >>>>>> objections to it, hashing is easy enough to add. Thanks for sharing your >>>>>> thoughts on this! >>>>>> >>>>>> Cheers, >>>>>> Chris >>>>>> >>>>>> On Tuesday, January 13, 2015 at 9:19:37 PM UTC, James Coleman wrote: >>>>>>> >>>>>>> As far as the Postgres limit, that also applies to index names. So I >>>>>>> don't see why we need to handle it any different for foreign keys >>>>>>> (i.e., >>>>>>> with indexes it just means that it fails on creation if the >>>>>>> auto-generated >>>>>>> one is too long and the dev has to provide a manual name.) >>>>>>> >>>>>>> On Tue, Jan 13, 2015 at 4:15 PM, Amiel Martin <am...@carnesmedia.com >>>>>>> > wrote: >>>>>>> >>>>>>>> My vote would be to be consistent with the way index names work; >>>>>>>> the long human readable version. >>>>>>>> >>>>>>>> -Amiel >>>>>>>> >>>>>>>> On Tue, Jan 13, 2015 at 12:31 PM, Ken Collins <k...@actionmoniker. >>>>>>>> com> wrote: >>>>>>>> >>>>>>>>> Though I have not felt the pain, I have been a long time user of >>>>>>>>> structure files in legacy environments and think consistent names are >>>>>>>>> a >>>>>>>>> good idea. On the flip side, the same could be said for constraint >>>>>>>>> name >>>>>>>>> “churn” too. I have seen this in big Oracle teams and unavoidable to >>>>>>>>> my >>>>>>>>> knowledge and/or only fixed with a custom script after the rake >>>>>>>>> migration >>>>>>>>> task. >>>>>>>>> >>>>>>>>> All that said, I think this is something Rails could solve and the >>>>>>>>> PG limit does seem like a big constraint too. >>>>>>>>> >>>>>>>>> - Cheers, >>>>>>>>> Ken >>>>>>>>> >>>>>>>>> On January 13, 2015 at 11:12:47 AM, ch...@sinjakli.co.uk (ch.. >>>>>>>>> .@sinjakli.co.uk) wrote: >>>>>>>>> >>>>>>>>> I'm really glad to see foreign key support has made its way into >>>>>>>>> Rails migrations, but very quickly ran into an issue with it when >>>>>>>>> working >>>>>>>>> in teams using structure.sql. >>>>>>>>> >>>>>>>>> Previously, we'd been using the foreigner gem, which generated FK >>>>>>>>> names based on the table and column. This meant the name was >>>>>>>>> consistent >>>>>>>>> every time you ran the migration. With the version that made it into >>>>>>>>> 4.2, part >>>>>>>>> of the FK name is random >>>>>>>>> <https://github.com/senny/rails/commit/8768305f20d12c40241396092a63e0d56269fefe#diff-a0775e1ec64264dc76a8ee71a5211ae3R697>. >>>>>>>>> >>>>>>>>> This means every dev who runs the migration locally generates a >>>>>>>>> different >>>>>>>>> version of structure.sql, leading to conflicts in version control. >>>>>>>>> >>>>>>>>> Right now we're working round this by explicitly setting the FK >>>>>>>>> name in our migrations. I'd like to find a way of fixing this in >>>>>>>>> Rails >>>>>>>>> itself though. >>>>>>>>> >>>>>>>>> My understanding was the reason for switching away from the old >>>>>>>>> format was that the name is arbitrary, and can fall out of date on >>>>>>>>> column >>>>>>>>> renames. By itself I'm not totally convinced that's enough reason to >>>>>>>>> get >>>>>>>>> rid of the more descriptive names (though I agree it's debatable). >>>>>>>>> The >>>>>>>>> restriction on the length of the name (63 characters in Postgres, for >>>>>>>>> example) is a more compelling reason for me. >>>>>>>>> >>>>>>>>> Either way, I'd like to contribute a patch to make migrations >>>>>>>>> generate consistent FK names. I'm happy to implement either of the >>>>>>>>> following (or something else if anyone's got a better ideas): >>>>>>>>> >>>>>>>>> * Switch back to generating human-readable names, accept that >>>>>>>>> people with long table/column names will occasionally have to set >>>>>>>>> them >>>>>>>>> manually >>>>>>>>> * Generate that human-readable name, hash it, and append a >>>>>>>>> substring of the hash to "fk_rails_". This would give you a name >>>>>>>>> which is >>>>>>>>> both short and consistent. >>>>>>>>> >>>>>>>>> Would really appreciate feedback on those approaches. >>>>>>>>> >>>>>>>>> Cheers, >>>>>>>>> Chris >>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>> Groups "Ruby on Rails: Core" group. >>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> send an email to rubyonrails-co...@googlegroups.com. >>>>>>>>> To post to this group, send email to rubyonra...@googlegroups.com. >>>>>>>>> Visit this group at http://groups.google.com/gr >>>>>>>>> oup/rubyonrails-core. >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>> Groups "Ruby on Rails: Core" group. >>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> send an email to rubyonrails-co...@googlegroups.com. >>>>>>>>> To post to this group, send email to rubyonra...@googlegroups.com. >>>>>>>>> Visit this group at http://groups.google.com/gr >>>>>>>>> oup/rubyonrails-core. >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "Ruby on Rails: Core" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to rubyonrails-co...@googlegroups.com. >>>>>>>> To post to this group, send email to rubyonra...@googlegroups.com. >>>>>>>> Visit this group at http://groups.google.com/group/rubyonrails-core >>>>>>>> . >>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>> >>>>>>> >>>>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Ruby on Rails: Core" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to rubyonrails-co...@googlegroups.com. >>>>> To post to this group, send email to rubyonra...@googlegroups.com. >>>>> Visit this group at http://groups.google.com/group/rubyonrails-core. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>>> >>>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Ruby on Rails: Core" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to rubyonrails-core+unsubscr...@googlegroups.com. >>>> To post to this group, send email to rubyonra...@googlegroups.com. >>>> Visit this group at http://groups.google.com/group/rubyonrails-core. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Ruby on Rails: Core" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to rubyonrails-co...@googlegroups.com. >>>> To post to this group, send email to rubyonra...@googlegroups.com. >>>> Visit this group at http://groups.google.com/group/rubyonrails-core. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "Ruby on Rails: Core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to rubyonrails-core+unsubscr...@googlegroups.com. >> To post to this group, send email to rubyonrails-core@googlegroups.com. >> Visit this group at http://groups.google.com/group/rubyonrails-core. >> For more options, visit https://groups.google.com/d/optout. >> > > -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-core+unsubscr...@googlegroups.com. To post to this group, send email to rubyonrails-core@googlegroups.com. Visit this group at http://groups.google.com/group/rubyonrails-core. For more options, visit https://groups.google.com/d/optout.