我有一个使用activerecord的本地用户模型。用户有一个电子邮件字段。我也有一个称为任务的 Activity 资源模型,该模型具有一个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_to上使用ActiveResource,因此除非您需要从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。

附注:以上解决方案的灵感来自https://stackoverflow.com/a/8844932/3770684

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

10-09 00:05