前面的
tagging一文中说道acts_as_taggable插件依赖于Rails的多态关联特性,今天我们就来看看它
有时候一个表和多个表关联,比如people和company都有address,我们可以利用Rails的多态关联来实现其功能
(其实我觉得标题应该改为Polymorphic Associations - belongs_to :whatevers才对)
1,Migrations
class AddPeopleCompanyAndAddressTables < ActiveRecord::Migration
def self.up
create_table :people do |t|
t.column :name, :string
end
create_table :companies do |t|
t.column :name, :string
end
create_table :addresses do |t|
t.column :street_address1, :string
t.column :street_address2, :string
t.column :city, :string
t.column :state, :string
t.column :country, :string
t.column :postal_code, :string
t.column :addressable_id, :integer
t.column :addressable_type, :string
end
end
def self.down
drop_table :people
drop_table :companies
drop_table :addresses
end
end
我们在addresses表加上addressable_id和addressable_type这两个字段而不是加上person_id或company_id来作为外键关联
2,Models
class Person < ActiveRecord::Base
has_many :addresses, :as => :addressable
end
class Company < ActiveRecord::Base
has_many :addresses, :as => :addressable
end
class Address < ActiveRecord::Base
belongs_to :addressable, :polymorphic => true
end
我们通过addressable来代替Person或Company或whatever,并且指明polymorphic为true
我们可以这样来建立关联:
person = Person.create(...)
address = Address.create(...)
address.addressable = person
分享到:
相关推荐
has_many:通过 这是关于如何使用has_many :throght创建多对多关联的完整示例has_many :throght在此示例中,我使用staff模型和client模型,其中人员有很多客户,而客户有很多员工 操作说明 在下面的终端中输入 $ ...
提供了一个默认类,但是任何使用文本session_id和data属性将对象鸭式键入Active Record Session类就足够了。 安装 将此宝石包括到您的Gemfile中: gem 'activerecord-session_store' 运行迁移生成器: rails ...
git clone git@github.com:jimibue/react-rails-semantic-starter.git更改为您的回购 cd project-name bundle install 在database.yml中,将数据库what_ever_you_named_your_start_project的名称更改为project-name...
rubocop-rails_config RuboCop配置具有与官方Ruby on Rails相同的代码样式检查。 安装 将此行添加到您的应用程序的Gemfile : gem "rubocop-rails_config" 用法 将此行添加到您的应用程序的.rubocop.yml : ...
### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...
BreadcrumbsOnRails :: JsonLd BreadcrumbsOnRails :: JsonLd提供了自定义生成器 。用法将builder: ...安装将此行添加到应用程序的Gemfile中: gem 'breadcrumbs_on_rails-json_ld' 然后执行: $ bundl
I18n ::后端:: ActiveRecord 该存储库包含I18n ...它创建一个迁移: class CreateTranslations < ActiveRecord::Migration def self.up create_table :translations do |t| t.string :locale t.string :key
Rails :: SessionCookie 快速,松散耦合的请求有关经过Cookie验证的应用程序的规范。 为什么 可能,您可能已经看到了很多像这样的代码: # config/initializers/session_store.rb Rails . application . config . ...
在您的类中使用has_cache提供了一个cached方法,该方法允许自动缓存通常在类或类的实例上可用的方法的结果。 它通过从调用cached的位置推断密钥,减轻了创建和跟踪密钥的麻烦,就像使用标准缓存存储接口一样。 用法...
Decidim :: NavigationMaps 该模块允许管理员上传...bundle exec rails decidim_navigation_maps:install:migrations bundle exec rails db:migrate 根据您的Decidim版本,选择相应的插件版本以确保兼容性: 导航图
在Rails控制器中添加send_zip方法,以发送包含一个或多个对象的.zip文件。 用法 带Array 假设您具有带有ActiveStorage的ActiveRecord模型,如下所示: # app/models/user.rb class User < ApplicationRecord ...
Administrate :: Field :: ActiveStorage 要知道的事情: 要预览pdf文件,您需要安装mupdf或Poppler 。 要预览视频文件,您需要安装ffmpeg 。... 对于rails 5.x,请使用以下命令 gem 'administrate-f
自述文件该自述文件通常会记录启动和运行应用程序所需的所有...one:贷方has_many:信用卡,从属::destroy has_many:项目,从属::destroy has_many:评论,相关::destroy has_many:likes,依赖::destroy ha
页面缓存是一种缓存方法,其中,响应主体存储在Web服务器可以直接提供服务的文件中: 对端点E的请求到达。 计算其响应并将其存储在文件F中。 下次请求E时,Web服务器直接发送F。 这仅适用于响应代码为200的GET或...
机架:: BearerAuth ... Rails :: Application # ... config . middleware . use Rack :: BearerAuth :: Middleware do match path : "/foo" do | token | # validate token # AccessToken.where
这是一个快速示例,将中间件添加到config/initializers/omniauth.rb:的 Rails 应用程序config/initializers/omniauth.rb: Rails.application.config.middleware.use OmniAuth::Builder do provider :open_wechat,...
GraphQL :: RailsLogger 关于 这个gem允许您以更易读的格式... 如果要更改此行为,请添加config/initializers/graphql_rails_logger.rb文件并设置适当的控制器和操作,如下所示: GraphQL :: RailsLogger . configure
在Sinatra中提供对内置Web服务支持的response_to样式Rails块 功能/问题: 根据提供的内容处理内容类型的设置 自动可以调整XMLHttpRequests返回Javascript 根据HTTP_ACCEPT标头解析识别请求。 优先级的顺序是...
dart-websocket_rails pub 包与由 gem 管理的进行通信。用法与 javascript-origin 非常相似。 参见 。打开连接 WebSocketRails railsWs = new WebSocketRails ( '${[removed].host}/websocket' ) .. connect ( ) ;...