外键class_name

马修

因此,这是我第一次使用外键,尽管我认为它们可以正常工作,但我不理解语法中的class_name部分。所引用的表是否在该class_name中?

我的代码:

游戏模型:

belongs_to :user, foreign_key: 'white_player_id', class_name: 'User'
belongs_to :user, foreign_key: 'black_player_id', class_name: 'User'

用户模型:

has_many :games, foreign_key: 'white_player_id', class_name: 'Game'
has_many :games, foreign_key: 'black_player_id', class_name: 'Game'

我当时在看:http: //ricostacruz.com/cheatsheets/rails-models.html,并指出在他们的示例中,它们具有指向Folder类的名称,这两个名称分别是belongs_to和has_many。

belongs_to :parent, :foreign_key => 'parent_id' class_name: 'Folder'
has_many :folders, :foreign_key => 'parent_id', class_name: 'Folder'

因此,这使我相信类名应该指向包含foreign_key的类?一点见识将不胜感激。

最大限度

您只是在定义错误的关系:

belongs_to :user, foreign_key: 'white_player_id', class_name: 'User'
belongs_to :user, foreign_key: 'black_player_id', class_name: 'User'

game.user在这种情况下将指向white_player_idblack_player_id

belongs_to :white_player, foreign_key: 'white_player_id', class_name: 'User'
belongs_to :black_player, foreign_key: 'black_player_id', class_name: 'User'

class_name 是相关对象的类。

foreign_key引用模型类的表,您在定义关系时要在其中定义belongs_to关系。

class Game < ActiveRecord::Base
  belongs_to :white_player, foreign_key: 'white_player_id', class_name: 'User'
  # foreign_key is game.white_player_id
end

因此,当我们执行game.white_playerActive Record时,它会寻找:

User.find(game.white_player_id)

添加:

在您的第二个示例foreign_key中,has_many引用了相关表。

belongs_to :parent, :foreign_key => 'parent_id' class_name: 'Folder'
has_many :folders, :foreign_key => 'parent_id', class_name: 'Folder'

而且您不需要显式指定外键和类名:

class Folder < ActiveRecord::Base
  # ActiveRecord will infer that the class name is Folder
  has_many :folders, foreign_key: 'parent_id'
  # Rails will infer that the foreign_key is parent_id
  belongs_to :parent, class_name: 'Folder'
end

如您所见,ActiveRecord是一种智能cookie,可以推断类名和外键。

这是has_manyand的一个更易于解释的示例foreign_keys

class User < ActiveRecord::Base
  has_many :unread_messages, -> { where read: false }, 
           foreign_key: 'recipient_id', # refers to messages.recipient_id
           class_name: 'Message'
end 

user.unread_messages 将查询表消息:

SELECT "messages".* FROM "messages" WHERE "messages"."recipient_id" # ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

显示“ class_name的实例”而不是数据

ArgumentError:未知键::conditions。有效键为::class_name,:class,:foreign_key

jQuery类选择器“ class_name”与“ .class_name”

为什么 .class_name:nth-child(even) 计算没有 .class_name 的元素

ArgumentError:未知键::order。有效键为:Rails 4.2.6中的:class_name,:anonymous_class

ruby-association 中的动态 class_name

属性class_name如何影响我的模型?

将class_name转换为活动记录迁移

所属名为的工厂女:class_name

Python-export_graphviz class_name类型错误

“ [Class_Name]必须存在” rails 5 rspec测试关联

没有class_name的FactoryBot命名空间模型

Python Pywinauto基于某些class_name的存在检测窗口

在类型提示中使用Type [class_name]而不是class_name时,python无法解析的属性引用

无法腌制<class'abc.class_name'>:在abc上的属性查找class_name失败

是否未定义对class_name <template_argument> function_name(变量)的引用?

Rails 5:不能通过class_name推断表名称

当fetch_object具有class_name参数的值时出现ArgumentCountError

什么时候dir(class_name)!= dir(instance)在python中

com.firebase.client.FirebaseException:无法解析具有类CLASS_NAME android的节点

Swift之前的@objc和上面的@objc(class_name)之间的区别?

选中单选按钮时更改其他元素的class_name

KeyError: 'class_name' in python3.7/site-packages/pandas/core/indexes/base.py

has_many:通过class_name和foreign_key不能正常工作

UnboundLocalError:赋值前引用了局部变量“class_name”

带有 has_many、through、class_name 和 where 子句的 Rails 模型关联

标识符 Class_name 未定义 C++ oop

如何将 class_name 传递给函数以在 Sqlalchemy Query 中使用

如何使用 Selenium by class_name 从大学橄榄球数据中抓取图像 url 列表