加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何使用外键定义activerecord和activeresourc

发布时间:2020-12-17 03:17:27 所属栏目:百科 来源:网络整理
导读:我有一个使用activerecord的本地用户模型.用户有一个电子邮件字段.我还有一个名为tasks的activeresource模型,它有一个created_by字段,用于存储提交用户的电子邮件地址.我想将这两者联系起来,但我正在努力使用正确的语法,甚至是否可能. ActiveResource的主要
我有一个使用activerecord的本地用户模型.用户有一个电子邮件字段.我还有一个名为tasks的activeresource模型,它有一个created_by字段,用于存储提交用户的电子邮件地址.我想将这两者联系起来,但我正在努力使用正确的语法,甚至是否可能.

ActiveResource的主要分支似乎甚至不支持外键.我找到了alternative branch,但仍然无法正常工作.

class User < ActiveRecord::Base
   has_many :tasks
end

class Task < ActiveResource::Base
  belongs_to :user
  schema do
    string 'created_by' #email
    # other fields
  end
end

解决方法

您的代码应该可以正常工作,因为您在Task上有一个user_id属性作为外键,或者您可以在User模型的关联中指定外键,如下所示:

class User < ActiveRecord::Base
  has_many :tasks,foreign_key: "uid"
end

现在问题是,你不能在ActiveResource上使用belongs_to,所以除非你需要从Task类的一个实例中检索用户,你可以删除它,关系的另一面仍然可以工作,但是,如果你需要要检索用户,您必须实现自己的finder方法,如下所示:

class Task < ActiveResource::Base
  schema do
    string 'created_by' #email
    # other fields
  end

  def user
    @user ||= User.find self.user_id # use the attribute name that represents the foreign key
  end

  def user=(user)
    @user = user
    self.update_attribute(:user_id,user.id)
  end
end

这基本上与您在ActiveRecord模型上的预期相同,但是如果您有多个关联,这可能会很烦人,因此您可以扩展ActiveResource模块以添加belongs_to,如下所示:

module BelongsToActiveResource

    def self.included(base)
      base.extend(ClassMethods)
    end

    module ClassMethods

    def belongs_to( name,options = {} )
      class_eval %(
        def #{name}
          @#{name} ||= name.to_s.classify.find( name.id )
        end

        def #{name}=(obj)
          @#{name} ||= obj
          self.update_attribute((name.to_s + "_id").to_sym,@#{name}.id
        end
      )
    end

  end

end   

ActiveResource::Base.class_eval { include BelongsToActiveResource }

这将允许您在任何ActiveResource模型上使用belongs_to.

P.S.:上述解决方案的灵感来自https://stackoverflow.com/a/8844932/3770684

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读