Sha256: fbc875aa36ad2706fa95189689627bc977e32676fd443ae9ca8988136b3aa114

Contents?: true

Size: 1.4 KB

Versions: 6

Compression:

Stored size: 1.4 KB

Contents

module OData
  # Internal class used to represent object associations
  class Association

    attr_reader :name, :namespace, :relationship, :from_role, :to_role

    def initialize(nav_prop_element, edmx)
      @edmx = edmx

      # Get the edm namespace because it varies by version
      edm_ns = @edmx.xpath("edmx:Edmx/edmx:DataServices/*", "edmx" => "http://schemas.microsoft.com/ado/2007/06/edmx").first.namespaces['xmlns'].to_s
      @edmx_namespaces = { "edmx" => "http://schemas.microsoft.com/ado/2007/06/edmx", "edm" => edm_ns }
      parse_nav_prop(nav_prop_element)
    end

    private

    def parse_nav_prop(element)
      @relationship = element['Relationship']
      relationship_parts = @relationship.split('.')
      @name = relationship_parts.pop
      @namespace = relationship_parts.join('.')
      @from_role = role_hash(@name, element['FromRole'])
      @to_role = role_hash(@name, element['ToRole'])
    end

    def role_hash(association_name, role_name)
      # Find the end role based on the assocation name
      role_xpath = "/edmx:Edmx/edmx:DataServices/edm:Schema[@Namespace='#{@namespace}']/edm:Association[@Name='#{association_name}']/edm:End[@Role='#{role_name}']"
      role_element = @edmx.xpath(role_xpath, @edmx_namespaces).first
      { role_name => {
          :edmx_type => "#{role_element['Type']}",
          :multiplicity => "#{role_element['Multiplicity']}"
      }}
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
ruby_odata-0.1.6 lib/ruby_odata/association.rb
ruby_odata-0.1.5 lib/ruby_odata/association.rb
ruby_odata-0.1.4 lib/ruby_odata/association.rb
ruby_odata-0.1.3 lib/ruby_odata/association.rb
ruby_odata-0.1.2 lib/ruby_odata/association.rb
ruby_odata-0.1.1 lib/ruby_odata/association.rb