使用多列建立关系时使用 rails 关联(即 model_name 和 model_id)
Using rails associations when using multiple columns to establish the relationship (i.e. model_name and model_id)
我有三个模型,User、Institute 和 File。这个想法是用户或机构都可以拥有许多独特的文件。但是,我不确定如何正确设置它们之间的关联。我希望能够发生的是让 @user.files 和 @institute.files return 与 user/institute 关联的文件列表,即:
@user.files = File.where("belongs_to_id = ? AND belongs_to_class = ?", @user.id, "User")
我不想添加对 user 和 institute 的引用(尽管这会起作用),所以如果我想添加一个也可以有多个文件的新模型,我不必修改它table。我可以使用自己的方法 return 文件,但我想知道是否有直接使用关联的方法?
谢谢,
class File
attr_accessible :belongs_to_class, :belongs_to_id
belongs_to :institute
belongs_to :user
end
class User
has_many :files
end
class Institute
has_many :files
end
如果我对你的问题的理解正确,你想关联所有 3 个模型,并且用户和机构通过 has-many 关联连接到文件模型:
class User
has_many :files
end
class Institute
has_many :files
end
class File
belongs_to :institute
belongs_to :user
end
files table should hold columns like:
name:string user_id:integer institute_id:integer
Here you can fetch files as :
User.first.files
Institute.first.files
我发现正确的方法是使用多态性:
迁移:
class CreateFiles
def change
create_table :files do |t|
t.references :owner, :polymorphic => true, :index => true, :null => false
end
end
end
型号:
class File
# owner_id :integer not null
# owner_type :string(255) not null
belongs_to :owner, :polymorphic => true
end
class User
has_many :files, :as => :owner, :dependent => :destroy
end
class Institute
has_many :files, :as => :owner, :dependent => :destroy
end
这允许我使用标准获取与任何模型关联的所有文件:model.files。
我有三个模型,User、Institute 和 File。这个想法是用户或机构都可以拥有许多独特的文件。但是,我不确定如何正确设置它们之间的关联。我希望能够发生的是让 @user.files 和 @institute.files return 与 user/institute 关联的文件列表,即:
@user.files = File.where("belongs_to_id = ? AND belongs_to_class = ?", @user.id, "User")
我不想添加对 user 和 institute 的引用(尽管这会起作用),所以如果我想添加一个也可以有多个文件的新模型,我不必修改它table。我可以使用自己的方法 return 文件,但我想知道是否有直接使用关联的方法?
谢谢,
class File
attr_accessible :belongs_to_class, :belongs_to_id
belongs_to :institute
belongs_to :user
end
class User
has_many :files
end
class Institute
has_many :files
end
如果我对你的问题的理解正确,你想关联所有 3 个模型,并且用户和机构通过 has-many 关联连接到文件模型:
class User
has_many :files
end
class Institute
has_many :files
end
class File
belongs_to :institute
belongs_to :user
end
files table should hold columns like:
name:string user_id:integer institute_id:integer
Here you can fetch files as :
User.first.files
Institute.first.files
我发现正确的方法是使用多态性:
迁移:
class CreateFiles
def change
create_table :files do |t|
t.references :owner, :polymorphic => true, :index => true, :null => false
end
end
end
型号:
class File
# owner_id :integer not null
# owner_type :string(255) not null
belongs_to :owner, :polymorphic => true
end
class User
has_many :files, :as => :owner, :dependent => :destroy
end
class Institute
has_many :files, :as => :owner, :dependent => :destroy
end
这允许我使用标准获取与任何模型关联的所有文件:model.files。