我有两个模型:作业和用户。
class Job < ActiveRecord::Base
end
class User < ActiveRecord::Base
end
我希望一份工作既有一个指代用户的“所有者”,也有一个分配给该工作的用户列表。
基本上,我希望能够做到:
job.owner # return user
job.users # returns users
用 ActiveRecord 关联建模的正确方法是什么?
我有两个模型:作业和用户。
class Job < ActiveRecord::Base
end
class User < ActiveRecord::Base
end
我希望一份工作既有一个指代用户的“所有者”,也有一个分配给该工作的用户列表。
基本上,我希望能够做到:
job.owner # return user
job.users # returns users
用 ActiveRecord 关联建模的正确方法是什么?
Rails 关联的大部分神奇之处在于为您找出类名。但是,如果需要,您可以自己指定。
架构应该如下所示:
create_table :jobs do |t|
t.integer :owner_id
end
create_table :users do |t|
t.references :job
end
这就是模型应该是什么样子
class Job < AR::Base
belongs_to :owner, class_name: "User"
has_many :users
end
class User < AR::Base
belongs_to :job
end
class Job < ActiveRecord::Base
belongs_to :owner, class_name: User
has_many :users
end
class User < ActiveRecord::Base
has_many :owned_jobs, class_name: Job
belongs_to :job
end
这样你就有:
@user.job
@user.owned_job
@job.owner
@job.users
还创建这样的列:
class SomeMigration
def change
add_column :jobs, :owner_id, :integer
add_column :users, :job_id, :integer
end
end
你可以在这里阅读更多:http: //guides.rubyonrails.org/association_basics.html
我认为您可能希望在这里使用另一种模型,以便用户可以在两种不同的环境中拥有工作——作为工作所有者和工作用户。
我会尝试这样的事情:
# Setup user model (users own jobs)
class User < ActiveRecord::Base
has_many :jobs
has_many :user_job_subscriptions
end
# Setup job model
class Job < ActiveRecord::Base
belongs_to :user
has_many :user_job_subscriptions
end
# Setup job subscription model (users can also have/subscribe to jobs)
class UserJobSubscriptions < ActiveRecord::Base
attr_accessible :user, :job
belongs_to :user
belongs_to :job
end
此外,这是一个很棒的视频(它有点过时,但没关系),它将帮助您了解可用的不同类型的关联 - 以及为什么/何时使用它们:http ://railscasts.com/episodes/47-两个多对多