활성 레코드 마이그레이션 레일의 has_many, belongs_to 관계 4
User
모델을 만들고 나중에 모델 을 만들었습니다 Task
. 나는 창조하는 동안 그들 사이의 어떤 관계도 언급하지 않았습니다.
나는 그것을 이해 User
has_many
Tasks
하고 Task
belongs_to
User
. 나는 이주를 통해 그들 사이에이 관계를 확립해야한다.
내 질문은 그 관계를 설정하기위한 마이그레이션 생성 명령은 무엇입니까?
어떤 도움이라도 대단히 감사하겠습니다.
다음과 같이 전화 할 수 있습니다.
rails g model task user:references
테이블에 user_id
열을 생성 tasks
하고 task.rb
모델을 수정하여 관계 를 추가합니다 belongs_to :user
. 모델에 has_many :tasks
또는 has_one :task
관계를 수동으로 입력해야합니다 user.rb
.
이미 생성 된 모델이있는 경우 다음을 사용하여 마이그레이션을 만들 수 있습니다.
rails g migration AddUserToTask user:belongs_to
다음을 생성합니다.
class AddUserToTask < ActiveRecord::Migration
def change
add_reference :tasks, :user, index: true
end
end
이 접근 방식의 유일한 차이점 belongs_to :user
은 task.rb
모델 의 관계가 자동으로 생성되지 않으므로 직접 생성해야한다는 것입니다.
"해당 관계를 설정하기위한 마이그레이션 생성 명령은 무엇입니까?"라는 질문에 대답하려면 (의미 : User has_many Tasks
& 와 같은 관계를 가진 기존 모델에 마이그레이션을 추가하는 방법 Task belongs_to User
)
제가 기억하는 가장 쉬운 방법은 다음과 같습니다.
>rails g migration AddUserToTask user:belongs_to
또는
>rails g migration AddUserToTask user:references
:belongs_to
의 별칭 :references
이므로 둘 중 하나가 동일한 작업을 수행합니다.
이렇게하면 명령이 마이그레이션 이름에서 테이블 이름을 유추하고 관계에 대한 열을 추가하는 변경 방법을 설정하고 색인화되도록 구성합니다.
class AddUserToTask < ActiveRecord::Migration
def change
add_reference :tasks, :user, index: true
end
end
생성 후 :
>rake db:migrate
마지막으로, 다른 답변에서 언급했듯이 모델에 일반적인 관계를 추가해야하지만 이것이 귀하의 질문에 대한 정답이라고 생각합니다.
처음에 마이그레이션을 생성 할 때 수행해야하는 방법 :
rails g scaffold child parent:references
parent:references
비트를 잊어 버린 경우 수행 할 작업 :
모델 / db에 자식에 대한 정의가 많이없는 경우. 가장 좋은 방법은를 실행 rails destroy scaffold child
한 다음 실행 rails g scaffold child parent:references
하는 것입니다. drop_table :children if table_exists? :children
새 테이블을 만드는 파일에서 테이블을 만들기 전에 줄을 추가해야 합니다. (그러면 누군가 코드를 가져 오면 마이그레이션을 실행하고 완료 할 수 있습니다.) 그러나 자식 모델에서 이미 손실하고 싶지 않은 데이터가있을 가능성이 더 높습니다.
이 경우 :
rails g migration add_parent_refs_to_child
## XXXXXXXXXXXXXX_add_parent_refs_to_child.rb
class AddParentRefsToChild < ActiveRecord::Migration
def change
add_reference :child, :parent, index: true
end
end
자세한 내용은 add_reference 를 참조하십시오 .
Also don't forget to make sure that the parent model has_[one | many] :children
, and that the child model belongs_to :parent
.
How not to do it:
You may be tempted just to go in and add the parent_id manually, and you certainly could, this not the best solution as it is not the conventional way to go about adding foreign keys, and doesn't lend itself very well to maintainability or readability. Convention over configuration!
The Ruby on Rails guide to association also has more helpful information on the subject.
There is no special migration command that would be used.
In your User model you will put
class User < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :user
end
In the corresponding migration file for the tasks you have the following field added user_id
Take a look at this guide
The migration will add the user's id to the task table so they know about each other
rails g migration AddUserIdToTask user_id:integer
then
rake db:migrate
And after update your controllers and views so that tasks can't be created on their own but must correspond to a user
The Relationship in Rails is taken care by model not by Rails.
So you just need to define this relationship in your model:
class User < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :user
end
And just make sure that a user_id
field is present in the migration for creating the "tasks" table.
'Program Tip' 카테고리의 다른 글
미디어 플레이어 루핑 : Android (0) | 2020.12.07 |
---|---|
개수 별 SQL 순서 (0) | 2020.12.07 |
Snake 케이스를 Lower Camel Case로 변환 (lowerCamelCase) (0) | 2020.12.07 |
OrderedDict 이해 (0) | 2020.12.07 |
C ++에서 new 대신 std :: allocator를 사용하는 이점은 무엇입니까? (0) | 2020.12.07 |