因此,这是我第一次使用外键,尽管我认为它们可以正常工作,但我不理解语法中的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_id
和black_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_player
Active 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_many
and的一个更易于解释的示例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] 删除。
我来说两句