ruby-on-rails - 如何使用外键定义 activerecord 和 activeresource 之间的关系?

标签 ruby-on-rails activerecord foreign-keys foreign-key-relationship 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

最佳答案

鉴于您有 user_id,您的代码应该可以正常工作。 Task 上的属性充当外键,或者您可以在 User 上的关联中指定外键型号如下:

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

现在的问题是,你不能使用 belongs_toActiveResource所以除非你需要检索 user来自 Task 的一个实例类,您可以删除它,关系的另一端仍然有效,但是,如果您需要检索 user那么你必须实现你自己的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

关于ruby-on-rails - 如何使用外键定义 activerecord 和 activeresource 之间的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24259346/

相关文章:

Mysql创建索引而不是外键约束

css - Bootstrap 危险类不适用于表行

ruby-on-rails - Rails 3,Active Record 查询返回 ActiveRecord::Relation 对象,而不是对象

mysql - SQL引用同一张表两次

ruby-on-rails - 将默认的 ActiveRecord id 从 0 更改为 1000000

mysql - 事件记录 has_many

mysql - 验证外键的技术、MVC Web 应用程序、MySQL

javascript - jQuery slider 不可拖动

ruby-on-rails - Ruby on Rails 和 Heroku "App Crashed"

ruby-on-rails - 使用 Ruby on Rails 将 XHTML 作为 application/xhtml+xml 提供服务