-
-
Notifications
You must be signed in to change notification settings - Fork 311
Fix namespaced models foreign key #460
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix namespaced models foreign key #460
Conversation
|
Would be happy to support getting this PR over the line, this is currently blocking our upgrade to the newest version @andreaslillebo @crmne |
1240926 to
6661392
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #460 +/- ##
=======================================
Coverage 89.24% 89.24%
=======================================
Files 37 37
Lines 1925 1925
Branches 541 541
=======================================
Hits 1718 1718
Misses 207 207 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
|
Y'all made my day today |
|
thank you guys so much, appreciate the quick turn-around 😄 |
|
You're welcome! It's now in 1.9.1 |
First of all, thank you very much for all the effort you put into this
gem. It is amazing. 🚀
## What this does
Version 1.8.2 breaks namespaced models with custom foreign keys.
Consider the following example:
```rb
ActiveRecord::Migration.create_table :support_conversations, force: true do |t|
t.string :model_id
t.timestamps
end
ActiveRecord::Migration.create_table :support_messages, force: true do |t|
t.references :conversation, foreign_key: { to_table: :support_conversations }
t.string :role
t.text :content
t.string :model_id
t.integer :input_tokens
t.integer :output_tokens
t.references :tool_call, foreign_key: { to_table: :support_tool_calls }
t.timestamps
end
ActiveRecord::Migration.create_table :support_tool_calls, force: true do |t|
t.references :message, foreign_key: { to_table: :support_messages }
t.string :tool_call_id
t.string :name
t.json :arguments
t.timestamps
end
```
```rb
module Support
def self.table_name_prefix
'support_'
end
class Conversation < ActiveRecord::Base
acts_as_chat message_class: 'Support::Message'
end
class Message < ActiveRecord::Base
acts_as_message chat: :conversation, chat_class: 'Support::Conversation', tool_call_class: 'Support::ToolCall'
end
class ToolCall < ActiveRecord::Base
acts_as_tool_call message_class: 'Support::Message'
end
end
```
```rb
Support::Conversation.last.messages
=> #<ActiveRecord::StatementInvalid:"PG::UndefinedColumn: ERROR: column support_messages.support_conversation_id does not exist
```
It does not work, since the correct foreign key should have been
`support_messages.conversation_id`.
I have added a test showcasing this and implemented a fix.
Since we cannot infer foreign keys automatically when it doesn't match
the model-name, we expose options to pass in a foreign key, similarly to
[associations in
Rails](https://guides.rubyonrails.org/association_basics.html#foreign-key):
```rb
class Support::Message < ActiveRecord::Base
acts_as_message chat_class: 'Conversation',
chat_foreign_key: 'conversation_id'
end
```
Generators have also been updated to add foreign keys if needed.
## Type of change
- [X] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation
- [ ] Performance improvement
## Scope check
- [X] I read the [Contributing
Guide](https://github.com/crmne/ruby_llm/blob/main/CONTRIBUTING.md)
- [X] This aligns with RubyLLM's focus on **LLM communication**
- [X] This isn't application-specific logic that belongs in user code
- [X] This benefits most users, not just my specific use case
## Quality check
- [X] I ran `overcommit --install` and all hooks pass
- [X] I tested my changes thoroughly
- [ ] For provider changes: Re-recorded VCR cassettes with `bundle exec
rake vcr:record[provider_name]`
- [X] All tests pass: `bundle exec rspec`
- [ ] I updated documentation if needed
- [X] I didn't modify auto-generated files manually (`models.json`,
`aliases.json`)
## API changes
- [ ] Breaking change
- [ ] New public methods/classes
- [X] Changed method signatures
- [ ] No API changes
## Related issues
Fixes bug introduced in crmne#425
---------
Co-authored-by: Carmine Paolino <[email protected]>
First of all, thank you very much for all the effort you put into this gem. It is amazing. 🚀
What this does
Version 1.8.2 breaks namespaced models with custom foreign keys. Consider the following example:
It does not work, since the correct foreign key should have been
support_messages.conversation_id.I have added a test showcasing this and implemented a fix.
Since we cannot infer foreign keys automatically when it doesn't match the model-name, we expose options to pass in a foreign key, similarly to associations in Rails:
Generators have also been updated to add foreign keys if needed.
Type of change
Scope check
Quality check
overcommit --installand all hooks passbundle exec rake vcr:record[provider_name]bundle exec rspecmodels.json,aliases.json)API changes
Related issues
Fixes bug introduced in #425