如果我创建一个新的rails 3迁移(例如)
rails g migration tester title:tester user:references
Run Code Online (Sandbox Code Playgroud)
,一切正常......但是,如果我添加一个包含以下内容的列:
rails g migration add_user_to_tester user:references
Run Code Online (Sandbox Code Playgroud)
参考字段无法识别.简而言之,问题是:如何从命令行向rails迁移添加引用列?
按照指南,我运行以下命令:
rails g migration CreateSnippetsUsers snippet:belongs_to user:belongs_to
Run Code Online (Sandbox Code Playgroud)
这创建了以下迁移:
class CreateSnippetsUsers < ActiveRecord::Migration[5.0]
def change
create_table :snippets_users do |t|
t.belongs_to :snippet, foreign_key: true
t.belongs_to :user, foreign_key: true
end
end
end
Run Code Online (Sandbox Code Playgroud)
在过去,我见过同样的事情,而index: true不是foreign_key: true.这两者有什么区别?
ruby-on-rails rails-migrations rails-activerecord ruby-on-rails-5
编辑 我已经从原版编辑了这个,以便更容易理解.
我理解对象关系阻抗问题.我理解Rails STI和多态(Rails方式,它不是真正的OO多态).我已经阅读了一大堆关于此的博客和问题,但仍无法找到这个问题的答案.
class Person < ApplicationRecord (ie what was ActiveRecord::Base)
end
class Employee < Person
end
class Customer < Person
end
Run Code Online (Sandbox Code Playgroud)
......多种其他类型的人
现在让我们说'客户'要求扩展系统,并创建一些新东西.我们称之为项目,我们可以为其分配员工:
好的,让我们使用第三范式创建多对多:
class Project < ApplicationRecord
has_many :assignments
has_many :employees, through: :assignments
end
class Employee < Person
has_many :assignments
has_many :projects, through: :assignments
end
class Assignment < ApplicationRecord
belongs_to :employee
belongs_to :project
end
Run Code Online (Sandbox Code Playgroud)
这不行.迁移将失败,因为没有名为Employee的表来创建外键约束.STI意味着'基类'是People表.
两个问题:
1你怎么解决这个问题?(为此你可能还想在这里筹码)
2如何为项目(应包括员工,但不包括人员或人员的其他子类型)正确创建序列化数据?
ProjectSerializer < ActiveModelSerializers
has_many :employees
has_many :employees, through: :assignments
end
Run Code Online (Sandbox Code Playgroud)
不会工作,所以你必须序列化人.
UPDATE
在迁移中,我创建了Project和Assignment表(Person已经存在).
所以现在数据库有这些表:
Project
Person
Assignment …Run Code Online (Sandbox Code Playgroud) 我正在使用rails_admin进行管理面板.只需更改图像模型中的关联
由此
class Image < ApplicationRecord
belongs_to :user
belongs_to :product
end
Run Code Online (Sandbox Code Playgroud)
对此
class Image < ApplicationRecord
has_one :user
has_one :product
end
Run Code Online (Sandbox Code Playgroud)
和用户模型是
class User < ApplicationRecord
has_many :images,dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)
当我尝试从管理面板编辑用户时出现此错误.从另一方面它工作正常.
ActiveRecord::StatementInvalid at /user/72/edit
PG::UndefinedColumn: ERROR: column users.image_id does not exist
LINE 1: SELECT "users".* FROM "users" WHERE "users"."image_id" = $1...
^
: SELECT "users".* FROM "users" WHERE "users"."image_id" = $1 LIMIT $2
Run Code Online (Sandbox Code Playgroud) ruby-on-rails rails-admin rails-activerecord ruby-on-rails-5
(Rails是5.0.0版,Ruby 2.3.0p0)
我想在Users表和Cards表之间创建一个关联.我已添加belongs_to :user到Cards模型和has_many :cardsUsers模型,并创建了一个迁移:
class AddUserIdToCard < ActiveRecord::Migration[5.0]
def change
add_foreign_key :cards, :users, column: :user_id
end
end
Run Code Online (Sandbox Code Playgroud)
当我跑rake db:migrate,我收到错误:
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "user_id" referenced in foreign key constraint does not exist
: ALTER TABLE "cards" ADD CONSTRAINT "fk_rails_8ef7749967"
FOREIGN KEY ("user_id")
REFERENCES "users" ("id")
Run Code Online (Sandbox Code Playgroud)
现在我最初只是通过添加add_column :cards, :user_id, :integer到迁移来解决这个问题,但这看起来并不是很整洁,我担心以后会出现问题.有没有更好的方法来实现这一目标?
如何将 aActiveRecord_AssociationRelation转换为 Rails 模型实例数组?
我有这样一个after_save钩子的代码:
class Like < ApplicationRecord
belongs_to :likee, class_name: 'User', foreign_key: 'likee_id'
belongs_to :liker, class_name: 'User', foreign_key: 'liker_id'
after_save :mutual_like?
private
def mutual_like?
if liker.likes.where(likee: liker) // returns collection proxy but I want to return an array of model instances so that I can create another model
end
end
end
Run Code Online (Sandbox Code Playgroud)
有没有办法返回实例数组?
表供参考:
create_table "likes", force: :cascade do |t|
t.integer "liker_id", null: false
t.integer "likee_id", null: false
...
end
Run Code Online (Sandbox Code Playgroud)
我认为问题在于 Rails 没有根据 likee_id / …