Program Tip

활성 레코드 마이그레이션 레일의 has_many, belongs_to 관계 4

programtip 2020. 12. 7. 20:34
반응형

활성 레코드 마이그레이션 레일의 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 :usertask.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.

참고URL : https://stackoverflow.com/questions/17894688/has-many-belongs-to-relation-in-active-record-migration-rails-4

반응형