Dud*_*olf 1 ruby-on-rails associations has-many has-one
我有如下设置:
用户.rb
class User < ActiveRecord::Base
...
has_many :projects_users
has_many :projects, through: :projects_users
...
end
Run Code Online (Sandbox Code Playgroud)
项目_用户.rb
class ProjectsUser < ActiveRecord::Base
belongs_to :project
belongs_to :user
has_one :projects_users_role
end
Run Code Online (Sandbox Code Playgroud)
项目.rb
class Project < ActiveRecord::Base
has_many :projects_users
has_many :users, through: :projects_users
end
Run Code Online (Sandbox Code Playgroud)
用户嵌套在我的路由文件中的项目下。
由于某种原因,我似乎找不到为用户访问单个项目的好方法。理想情况下我想创建一个
has_one :project_user
Run Code Online (Sandbox Code Playgroud)
关联,然后是
has_one :project, through: :project_user
Run Code Online (Sandbox Code Playgroud)
并以某种方式将项目的 ID 传递给协会(我知道这是不可能的)。任何好的方法的想法。
然后我想调用类似的方法
@user = User.includes(:project (project_id parameter).find(:id)
Run Code Online (Sandbox Code Playgroud)
在我的用户控制器中。
非常感谢任何帮助。
谢谢
更新
我本质上在projects_users.rb中为每个项目每个用户附加了一个角色(上面更新并在下面添加)
项目_用户.rb
class ProjectsUser < ActiveRecord::Base
belongs_to :project
belongs_to :user
has_one :projects_users_role
end
Run Code Online (Sandbox Code Playgroud)
项目_用户_角色.rb
class ProjectsUsersRole < ActiveRecord::Base
belongs_to :projects_user
enum role: [...]
end
Run Code Online (Sandbox Code Playgroud)
我的目标,我之前应该已经说过,是能够通过类似的路线在给定项目上为用户编辑这个角色
/projects/1/users/2/edit-roles
Run Code Online (Sandbox Code Playgroud)
这将显示用户,并允许我将角色分配给projects_users_roles表,并添加嵌套的id,即project_users表中的id。因此,我希望(我认为)对带有参数的项目有一个 has_one ,以便我的嵌套形式会更简单。
更新2
我偶然发现了这个
has_one :project_department, ->(department) { where department: department }, class_name: 'ProjectDepartment'
Run Code Online (Sandbox Code Playgroud)
从这里http://www.rojotek.com/blog/2014/05/16/cool-stuff-you-can-do-with-rails-has_one/但不能将其应用为用“项目”替换“部门”在加入中不使用项目 ID,但在我的情况下使用用户 ID。
user.rb更新
...
has_one :project_user, -> (project) { where project: project}, class_name: 'ProjectsUser'
has_one :project, through: :project_user
...
Run Code Online (Sandbox Code Playgroud)
从控制台
User.first.project_user(1)
User Load (0.2ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
ProjectsUser Load (0.1ms) SELECT `projects_users`.* FROM `projects_users` WHERE `projects_users`.`user_id` = 26 AND `projects_users`.`project_id` = 26 LIMIT 1
Run Code Online (Sandbox Code Playgroud)
在这种情况下,project_id 应为 1,但它使用的是 user.id 26。不确定为什么。
再次感谢
这是正确的,如果您有一个 model User,则传递给闭包的参数是self被调用的类实例,即它将是 的实例User。所以在下面的代码段中project变量将有一个user值。
用户.rb
has_one :project_user, -> (project) { where project: project}, class_name: 'ProjectsUser'
Run Code Online (Sandbox Code Playgroud)
要向has_many/one关系传递附加参数,请使用扩展选择器:
class User < ActiveRecord::Base
has_one :project_user, class_name: 'ProjectsUser' do
def for_project(project)
where(project: project)
end
end
end
customers.project_user.for_project(project)
Run Code Online (Sandbox Code Playgroud)
该方法Association Extension在 RailsAssociation页面的 head 中进行了描述。
| 归档时间: |
|
| 查看次数: |
5489 次 |
| 最近记录: |