使用多列建立关系时使用 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。