【问题标题】:Rails has_many with alias nameRails has_many 具有别名
【发布时间】:2010-11-12 21:04:31
【问题描述】:

在我的用户模型中,我可以:

has_many :tasks

在我的任务模型中:

belongs_to :user

然后,假设外键“user_id”存储在任务表中,我可以使用:

@user.tasks

我的问题是,我如何声明 has_many 关系,以便我可以将用户的任务称为:

@user.jobs

...或...

@user.foobars

非常感谢。

【问题讨论】:

  • 我会厌倦使用 Task 作为类名 - 它是 Rails 的保留字,可能会在未来引起奇怪的问题:reservedwords.herokuapp.com

标签: ruby-on-rails has-many


【解决方案1】:

如果你使用has_many,并且想别名:

has_many :alias_name, through: model_name, source: initial_name

【讨论】:

  • 为了清楚起见,model_nameinitial_name 应该是这样的符号 :model_name:initial_name
【解决方案2】:

完成@SamSaffron 的回答:

您可以将class_nameforeign_keyinverse_of 一起使用。我个人更喜欢更抽象的声明式,但这真的只是一个品味问题:

class BlogPost
  has_many :images, class_name: "BlogPostImage", inverse_of: :blog_post  
end

并且您需要确保子模型上有belongs_to 属性:

class BlogPostImage
  belongs_to :blog_post
end

【讨论】:

    【解决方案3】:

    如果您仍然希望能够将它们称为任务,也可以使用 alias_attribute

    class User < ActiveRecord::Base
      alias_attribute :jobs, :tasks
    
      has_many :tasks
    end
    

    【讨论】:

    • 请注意,alias_attribute 调用必须在关联之前。
    【解决方案4】:

    试一试:

    has_many :jobs, foreign_key: "user_id", class_name: "Task"
    

    请注意,:as 用于 polymorphic associations

    【讨论】:

    • 感谢您还包括外键 - 解决了我类似但不同的问题。
    • 这在任务方面是否需要任何特别的东西,还是通常的belongs_to 就足够了?
    • 仅供参考:这也适用于 has_and_belongs_to_many 关联,只是不需要“foreign_key”片段
    【解决方案5】:

    您可以通过两种不同的方式来做到这一点。一种是使用“as”

    has_many :tasks, :as => :jobs
    

    def jobs
         self.tasks
    end
    

    显然第一个是最好的处理方式。

    【讨论】:

    • 谢谢,听起来很完美。不幸的是,这不起作用: USER MODEL: has_many :tasks, :as => :created_tasks CONTROLLER: @created_tasks = @user.created_tasks ----- TasksController 中的 NoMethodError #index undefined method `created_tasks' for #<0xb6050b5c>
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多