在 Rails 中选择 has_many 关系之一
Selecting one of a has_many relation in Rails
从 has_many 关系中为 Rails 中的特定模型选择特定记录的首选方法是什么? (我正在使用 Rails 5。)
我有一个模型 User
和一个模型 Picture
,它们通过以下代码关联:
class User < ApplicationRecord
has_many :pictures, as: :imageable
# ...
end
class Picture < ApplicationRecord
belongs_to :imageable, polymorphic: true
# ...
end
我想要做的是允许 User
从与其关联的图像中设置个人资料图片,这样我就可以在 User
对象上调用 @user.profile_picture
并检索头像。
您可以添加额外的一对一关系。
# create by running:
# rails g migration AddPrimaryPictureToUser
class AddPrimaryPictureToUser < ActiveRecord::Migration[5.0]
def change
add_column :users, :primary_picture_id, :integer
add_index :users, :primary_picture_id
add_foreign_key :users, :pictures, column: :primary_picture_id
end
end
class User < ApplicationRecord
has_many :pictures, as: :imageable
# This should be belongs_to and not has_one as the foreign key column is
# on the users table
belongs_to :primary_picture,
class_name: 'Picture',
optional: true
end
class Picture < ApplicationRecord
belongs_to :imageable, polymorphic: true
has_one :primary_user,
foreign_key: 'primary_picture_id',
class_name: 'User'
# ...
end
这样做的主要原因与例如 pictures
table 上的布尔标志相比是因为拥有单独的关系可以很容易地加入,这对于避免 N+1 很重要如果您要列出一群用户及其主要图片,那么查询就会成为一个问题。
@users = User.includes(:primary_picture).all
从 has_many 关系中为 Rails 中的特定模型选择特定记录的首选方法是什么? (我正在使用 Rails 5。)
我有一个模型 User
和一个模型 Picture
,它们通过以下代码关联:
class User < ApplicationRecord
has_many :pictures, as: :imageable
# ...
end
class Picture < ApplicationRecord
belongs_to :imageable, polymorphic: true
# ...
end
我想要做的是允许 User
从与其关联的图像中设置个人资料图片,这样我就可以在 User
对象上调用 @user.profile_picture
并检索头像。
您可以添加额外的一对一关系。
# create by running:
# rails g migration AddPrimaryPictureToUser
class AddPrimaryPictureToUser < ActiveRecord::Migration[5.0]
def change
add_column :users, :primary_picture_id, :integer
add_index :users, :primary_picture_id
add_foreign_key :users, :pictures, column: :primary_picture_id
end
end
class User < ApplicationRecord
has_many :pictures, as: :imageable
# This should be belongs_to and not has_one as the foreign key column is
# on the users table
belongs_to :primary_picture,
class_name: 'Picture',
optional: true
end
class Picture < ApplicationRecord
belongs_to :imageable, polymorphic: true
has_one :primary_user,
foreign_key: 'primary_picture_id',
class_name: 'User'
# ...
end
这样做的主要原因与例如 pictures
table 上的布尔标志相比是因为拥有单独的关系可以很容易地加入,这对于避免 N+1 很重要如果您要列出一群用户及其主要图片,那么查询就会成为一个问题。
@users = User.includes(:primary_picture).all